|
P: n/a
|
Vish
Hi,
I am trying to expose my .NET 2.0 class as a COM type using the following
attributes for the attributes
[ClassInterface(ClassInterfaceType.None)]
[Guid("8D0240AD-1BBE-4831-8214-39DD46A4A797")]
I have the "Register for COM Interop" build property set to true. I also
have two functions in the class to register and unregister the COM with the
registry. But when i try to build it in VS.NET 2005, i get the following
error "XXX.dll does not contain any types that can be registered for COM
Interop" and "XXX.dll does not contain any types that can be Unregistered for
COM Interop". The same code works perfectly in VS.NET 2003. Anybody know of
any reasons why this is happeneing or what i am doing wrong?
Thank You,
Vish | |
Share this Question
|
P: n/a
|
Nicholas Paldino [.NET/C# MVP]
Vish,
Is it an error in the build process, or the registration process?
--
- Nicholas Paldino [.NET/C# MVP]
- mvp@spam.guard.caspershouse.com
"Vish" <Vish@discussions.microsoft.com> wrote in message
news:1971A23E-7E8D-4605-A5B3-FDCF6BF4F6C1@microsoft.com...[color=blue]
> Hi,
>
> I am trying to expose my .NET 2.0 class as a COM type using the following
> attributes for the attributes
>
> [ClassInterface(ClassInterfaceType.None)]
> [Guid("8D0240AD-1BBE-4831-8214-39DD46A4A797")]
>
> I have the "Register for COM Interop" build property set to true. I also
> have two functions in the class to register and unregister the COM with
> the
> registry. But when i try to build it in VS.NET 2005, i get the following
> error "XXX.dll does not contain any types that can be registered for COM
> Interop" and "XXX.dll does not contain any types that can be Unregistered
> for
> COM Interop". The same code works perfectly in VS.NET 2003. Anybody know
> of
> any reasons why this is happeneing or what i am doing wrong?
>
> Thank You,
> Vish[/color] | | |
P: n/a
|
Jason Newell
Vish,
Could it be that ComVisible is false by default now in 2.0? Try the
following example and see if it works.
[ClassInterface(ClassInterfaceType.None)]
[Guid("8D0240AD-1BBE-4831-8214-39DD46A4A797")]
[ComVisible(true)]
Jason Newell
Vish wrote:[color=blue]
> Hi,
>
> I am trying to expose my .NET 2.0 class as a COM type using the following
> attributes for the attributes
>
> [ClassInterface(ClassInterfaceType.None)]
> [Guid("8D0240AD-1BBE-4831-8214-39DD46A4A797")]
>
> I have the "Register for COM Interop" build property set to true. I also
> have two functions in the class to register and unregister the COM with the
> registry. But when i try to build it in VS.NET 2005, i get the following
> error "XXX.dll does not contain any types that can be registered for COM
> Interop" and "XXX.dll does not contain any types that can be Unregistered for
> COM Interop". The same code works perfectly in VS.NET 2003. Anybody know of
> any reasons why this is happeneing or what i am doing wrong?
>
> Thank You,
> Vish[/color] | | |
P: n/a
|
Willy Denoyette [MVP]
"Vish" <Vish@discussions.microsoft.com> wrote in message
news:1971A23E-7E8D-4605-A5B3-FDCF6BF4F6C1@microsoft.com...[color=blue]
> Hi,
>
> I am trying to expose my .NET 2.0 class as a COM type using the following
> attributes for the attributes
>
> [ClassInterface(ClassInterfaceType.None)]
> [Guid("8D0240AD-1BBE-4831-8214-39DD46A4A797")]
>
> I have the "Register for COM Interop" build property set to true. I also
> have two functions in the class to register and unregister the COM with
> the
> registry. But when i try to build it in VS.NET 2005, i get the following
> error "XXX.dll does not contain any types that can be registered for COM
> Interop" and "XXX.dll does not contain any types that can be Unregistered
> for
> COM Interop". The same code works perfectly in VS.NET 2003. Anybody know
> of
> any reasons why this is happeneing or what i am doing wrong?
>
> Thank You,
> Vish[/color]
Don't know what exactly you do in the functions that register/unregister the
class, mind to post your code?
Willy. | | |
P: n/a
|
Vish
Hi Jason,
Seems like that did the trick. i am able to build the class after setting
the ComVisible attribute of the class to true. I appreciate your help in this
matter.
Thank You,
Vish
"Jason Newell" wrote:
[color=blue]
> Vish,
>
> Could it be that ComVisible is false by default now in 2.0? Try the
> following example and see if it works.
>
> [ClassInterface(ClassInterfaceType.None)]
> [Guid("8D0240AD-1BBE-4831-8214-39DD46A4A797")]
> [ComVisible(true)]
>
>
> Jason Newell
>
>
> Vish wrote:[color=green]
> > Hi,
> >
> > I am trying to expose my .NET 2.0 class as a COM type using the following
> > attributes for the attributes
> >
> > [ClassInterface(ClassInterfaceType.None)]
> > [Guid("8D0240AD-1BBE-4831-8214-39DD46A4A797")]
> >
> > I have the "Register for COM Interop" build property set to true. I also
> > have two functions in the class to register and unregister the COM with the
> > registry. But when i try to build it in VS.NET 2005, i get the following
> > error "XXX.dll does not contain any types that can be registered for COM
> > Interop" and "XXX.dll does not contain any types that can be Unregistered for
> > COM Interop". The same code works perfectly in VS.NET 2003. Anybody know of
> > any reasons why this is happeneing or what i am doing wrong?
> >
> > Thank You,
> > Vish[/color]
>[/color] | | |
P: n/a
|
Vish
Hi Nicholas,
The error occured while building. But i was able to solve the problem by
setting the ComVisible attribute to true on the class according to Jason's
reply. I think the ComVisible attribute is set to false by default where in
it was true by default in 1.1.
I appreciate your help in this matter.
Thank You,
Vish
"Nicholas Paldino [.NET/C# MVP]" wrote:
[color=blue]
> Vish,
>
> Is it an error in the build process, or the registration process?
>
>
> --
> - Nicholas Paldino [.NET/C# MVP]
> - mvp@spam.guard.caspershouse.com
>
> "Vish" <Vish@discussions.microsoft.com> wrote in message
> news:1971A23E-7E8D-4605-A5B3-FDCF6BF4F6C1@microsoft.com...[color=green]
> > Hi,
> >
> > I am trying to expose my .NET 2.0 class as a COM type using the following
> > attributes for the attributes
> >
> > [ClassInterface(ClassInterfaceType.None)]
> > [Guid("8D0240AD-1BBE-4831-8214-39DD46A4A797")]
> >
> > I have the "Register for COM Interop" build property set to true. I also
> > have two functions in the class to register and unregister the COM with
> > the
> > registry. But when i try to build it in VS.NET 2005, i get the following
> > error "XXX.dll does not contain any types that can be registered for COM
> > Interop" and "XXX.dll does not contain any types that can be Unregistered
> > for
> > COM Interop". The same code works perfectly in VS.NET 2003. Anybody know
> > of
> > any reasons why this is happeneing or what i am doing wrong?
> >
> > Thank You,
> > Vish[/color]
>
>
>[/color] | | |
P: n/a
|
Vish
Hi Willy,
Jason's suggestion fixed my problem. Looks like the ComVisible property is
false by default in .NET 2.0 where in it was true by default in 1.1. If you
are still interested in looking at the code, let me know. I will post it. I
appreciate you help with this issue.
Thank You,
Vish
"Willy Denoyette [MVP]" wrote:
[color=blue]
>
> "Vish" <Vish@discussions.microsoft.com> wrote in message
> news:1971A23E-7E8D-4605-A5B3-FDCF6BF4F6C1@microsoft.com...[color=green]
> > Hi,
> >
> > I am trying to expose my .NET 2.0 class as a COM type using the following
> > attributes for the attributes
> >
> > [ClassInterface(ClassInterfaceType.None)]
> > [Guid("8D0240AD-1BBE-4831-8214-39DD46A4A797")]
> >
> > I have the "Register for COM Interop" build property set to true. I also
> > have two functions in the class to register and unregister the COM with
> > the
> > registry. But when i try to build it in VS.NET 2005, i get the following
> > error "XXX.dll does not contain any types that can be registered for COM
> > Interop" and "XXX.dll does not contain any types that can be Unregistered
> > for
> > COM Interop". The same code works perfectly in VS.NET 2003. Anybody know
> > of
> > any reasons why this is happeneing or what i am doing wrong?
> >
> > Thank You,
> > Vish[/color]
>
> Don't know what exactly you do in the functions that register/unregister the
> class, mind to post your code?
>
>
> Willy.
>
>
>[/color] | | |
P: n/a
|
Willy Denoyette [MVP]
Can't be the reason as the default for ComVisible is still true.
Willy.
"Vish" <Vish@discussions.microsoft.com> wrote in message
news:031183D1-0F72-4AF0-96CF-4E283F129869@microsoft.com...[color=blue]
> Hi Willy,
>
> Jason's suggestion fixed my problem. Looks like the ComVisible property is
> false by default in .NET 2.0 where in it was true by default in 1.1. If
> you
> are still interested in looking at the code, let me know. I will post it.
> I
> appreciate you help with this issue.
>
> Thank You,
> Vish
>
>
> "Willy Denoyette [MVP]" wrote:
>[color=green]
>>
>> "Vish" <Vish@discussions.microsoft.com> wrote in message
>> news:1971A23E-7E8D-4605-A5B3-FDCF6BF4F6C1@microsoft.com...[color=darkred]
>> > Hi,
>> >
>> > I am trying to expose my .NET 2.0 class as a COM type using the
>> > following
>> > attributes for the attributes
>> >
>> > [ClassInterface(ClassInterfaceType.None)]
>> > [Guid("8D0240AD-1BBE-4831-8214-39DD46A4A797")]
>> >
>> > I have the "Register for COM Interop" build property set to true. I
>> > also
>> > have two functions in the class to register and unregister the COM with
>> > the
>> > registry. But when i try to build it in VS.NET 2005, i get the
>> > following
>> > error "XXX.dll does not contain any types that can be registered for
>> > COM
>> > Interop" and "XXX.dll does not contain any types that can be
>> > Unregistered
>> > for
>> > COM Interop". The same code works perfectly in VS.NET 2003. Anybody
>> > know
>> > of
>> > any reasons why this is happeneing or what i am doing wrong?
>> >
>> > Thank You,
>> > Vish[/color]
>>
>> Don't know what exactly you do in the functions that register/unregister
>> the
>> class, mind to post your code?
>>
>>
>> Willy.
>>
>>
>>[/color][/color] | | |
P: n/a
|
Jason Newell
Vish,
Willy is correct per documentation: http://msdn2.microsoft.com/en-us/lib...US,VS.80).aspx.
I'd be interested to know why explicitly settings [ComVisible(true)]
fixed the problem. Unfortunately, I don't have 2.0 or I'd test it myself.
Jason Newell
Willy Denoyette [MVP] wrote:[color=blue]
> Can't be the reason as the default for ComVisible is still true.
>
> Willy.
>
> "Vish" <Vish@discussions.microsoft.com> wrote in message
> news:031183D1-0F72-4AF0-96CF-4E283F129869@microsoft.com...
>[color=green]
>>Hi Willy,
>>
>>Jason's suggestion fixed my problem. Looks like the ComVisible property is
>>false by default in .NET 2.0 where in it was true by default in 1.1. If
>>you
>>are still interested in looking at the code, let me know. I will post it.
>>I
>>appreciate you help with this issue.
>>
>>Thank You,
>>Vish
>>
>>
>>"Willy Denoyette [MVP]" wrote:
>>
>>[color=darkred]
>>>"Vish" <Vish@discussions.microsoft.com> wrote in message
>>>news:1971A23E-7E8D-4605-A5B3-FDCF6BF4F6C1@microsoft.com...
>>>
>>>>Hi,
>>>>
>>>>I am trying to expose my .NET 2.0 class as a COM type using the
>>>>following
>>>>attributes for the attributes
>>>>
>>>>[ClassInterface(ClassInterfaceType.None)]
>>>>[Guid("8D0240AD-1BBE-4831-8214-39DD46A4A797")]
>>>>
>>>>I have the "Register for COM Interop" build property set to true. I
>>>>also
>>>>have two functions in the class to register and unregister the COM with
>>>>the
>>>>registry. But when i try to build it in VS.NET 2005, i get the
>>>>following
>>>>error "XXX.dll does not contain any types that can be registered for
>>>>COM
>>>>Interop" and "XXX.dll does not contain any types that can be
>>>>Unregistered
>>>>for
>>>>COM Interop". The same code works perfectly in VS.NET 2003. Anybody
>>>>know
>>>>of
>>>>any reasons why this is happeneing or what i am doing wrong?
>>>>
>>>>Thank You,
>>>>Vish
>>>
>>>Don't know what exactly you do in the functions that register/unregister
>>>the
>>>class, mind to post your code?
>>>
>>>
>>>Willy.
>>>
>>>
>>>[/color][/color]
>
>
>[/color] | | |
P: n/a
|
Willy Denoyette [MVP]
"Jason Newell" <nospam@nospam.com> wrote in message
news:OeqVDFK5FHA.3588@TK2MSFTNGP15.phx.gbl...[color=blue]
> Vish,
>
> Willy is correct per documentation:
> http://msdn2.microsoft.com/en-us/lib...US,VS.80).aspx.
>
> I'd be interested to know why explicitly settings [ComVisible(true)] fixed
> the problem. Unfortunately, I don't have 2.0 or I'd test it myself.
>
> Jason Newell
>
>[/color]
And not only per documentation ;-), it was the default since version 1.0 and
did not change in v2.0 (that would be a breaking change).
I tested this with v2.0 and I can confirm 'true' is still the default.
Willy. | | |
P: n/a
|
Jason Newell
Yeah I know it's always been default because it's bitten me in the
rear-end a few times ;-). I honestly didn't think that they would have
made a breaking change like that. So the question that still remains,
did setting [ComVisible(true)] really solve the problem or was it
something else?
Jason Newell
Willy Denoyette [MVP] wrote:[color=blue]
> "Jason Newell" <nospam@nospam.com> wrote in message
> news:OeqVDFK5FHA.3588@TK2MSFTNGP15.phx.gbl...
>[color=green]
>>Vish,
>>
>>Willy is correct per documentation:
>> http://msdn2.microsoft.com/en-us/lib...US,VS.80).aspx.
>>
>>I'd be interested to know why explicitly settings [ComVisible(true)] fixed
>>the problem. Unfortunately, I don't have 2.0 or I'd test it myself.
>>
>>Jason Newell
>>
>>[/color]
>
>
> And not only per documentation ;-), it was the default since version 1.0 and
> did not change in v2.0 (that would be a breaking change).
> I tested this with v2.0 and I can confirm 'true' is still the default.
>
> Willy.
>
>[/color] | | |
P: n/a
|
Willy Denoyette [MVP]
"Jason Newell" <nospam@nospam.com> wrote in message
news:eCS0FVK5FHA.4036@TK2MSFTNGP11.phx.gbl...[color=blue]
> Yeah I know it's always been default because it's bitten me in the
> rear-end a few times ;-). I honestly didn't think that they would have
> made a breaking change like that. So the question that still remains, did
> setting [ComVisible(true)] really solve the problem or was it something
> else?
>
>
> Jason Newell
>
>[/color]
Pretty sure it was something else (my guess: missing public on the class).
Willy. | | |
P: n/a
|
Vish
Hi,
Ok. I am not sure why but it did fix the issue. Obviously y'all know more on
this subject than i do. But i am posting my code below if y'all are still
interested.
[ClassInterface(ClassInterfaceType.None)]
[Guid("8D0240AD-1BBE-4831-8214-39DD46A4A797")]
[ComVisible(true)]
public sealed class TestTool : BaseCommand
{
private IApplication m_app;
public override void OnCreate(object hook)
{
if (hook != null)
{
if (hook is IMxApplication)
{
m_app = (IApplication)hook;
}
}
}
public override void OnClick()
{
IMxDocument mxDoc = (IMxDocument)m_app.Document;
IActiveView activeView = mxDoc.ActiveView;
activeView.Extent = activeView.FullExtent;
activeView.Refresh();
}
public TestTool()
{
base.m_category = "Vish's Test";
base.m_caption = "Full Extent C#";
base.m_message = "Zooms the display to its full extent";
base.m_toolTip = "Full Extent C#";
base.m_name = "Developer Samples_FullExtent C#";
string[] res = GetType().Assembly.GetManifestResourceNames();
if (res.GetLength(0) > 0)
{
base.m_bitmap = new
System.Drawing.Bitmap(GetType().Assembly.GetManife stResourceStream(res[0]));
}
}
#region Component Category Registration
[ComRegisterFunction()]
[ComVisible(false)]
static void RegisterFunction(String regKey)
{
MxCommands.Register(regKey);
}
[ComUnregisterFunction()]
[ComVisible(false)]
static void UnregisterFunction(String regKey)
{
MxCommands.Unregister(regKey);
}
#endregion
}
"Willy Denoyette [MVP]" wrote:
[color=blue]
>
> "Jason Newell" <nospam@nospam.com> wrote in message
> news:eCS0FVK5FHA.4036@TK2MSFTNGP11.phx.gbl...[color=green]
> > Yeah I know it's always been default because it's bitten me in the
> > rear-end a few times ;-). I honestly didn't think that they would have
> > made a breaking change like that. So the question that still remains, did
> > setting [ComVisible(true)] really solve the problem or was it something
> > else?
> >
> >
> > Jason Newell
> >
> >[/color]
>
> Pretty sure it was something else (my guess: missing public on the class).
>
> Willy.
>
>
>
>
>[/color] | | |
P: n/a
|
Willy Denoyette [MVP]
Sorry, but this is not a complete sample (missing BaseCommand), so there is
lttle I can do with it, but trust me [ComVisible(true)] IS the default.
I'm also not entirely clear on the purpose is of this class for a COM
client, true, this object creatable from COM clients, but none of it's
methods are callable.
Willy.
"Vish" <Vish@discussions.microsoft.com> wrote in message
news:EBA6A147-26D1-4A45-8968-E5310CA2A179@microsoft.com...[color=blue]
> Hi,
>
> Ok. I am not sure why but it did fix the issue. Obviously y'all know more
> on
> this subject than i do. But i am posting my code below if y'all are still
> interested.
>
> [ClassInterface(ClassInterfaceType.None)]
> [Guid("8D0240AD-1BBE-4831-8214-39DD46A4A797")]
> [ComVisible(true)]
> public sealed class TestTool : BaseCommand
> {
> private IApplication m_app;
>
> public override void OnCreate(object hook)
> {
> if (hook != null)
> {
> if (hook is IMxApplication)
> {
> m_app = (IApplication)hook;
> }
> }
> }
>
> public override void OnClick()
> {
> IMxDocument mxDoc = (IMxDocument)m_app.Document;
> IActiveView activeView = mxDoc.ActiveView;
> activeView.Extent = activeView.FullExtent;
> activeView.Refresh();
> }
>
> public TestTool()
> {
> base.m_category = "Vish's Test";
> base.m_caption = "Full Extent C#";
> base.m_message = "Zooms the display to its full extent";
> base.m_toolTip = "Full Extent C#";
> base.m_name = "Developer Samples_FullExtent C#";
>
> string[] res = GetType().Assembly.GetManifestResourceNames();
> if (res.GetLength(0) > 0)
> {
> base.m_bitmap = new
> System.Drawing.Bitmap(GetType().Assembly.GetManife stResourceStream(res[0]));
> }
> }
>
> #region Component Category Registration
>
> [ComRegisterFunction()]
> [ComVisible(false)]
> static void RegisterFunction(String regKey)
> {
> MxCommands.Register(regKey);
> }
>
> [ComUnregisterFunction()]
> [ComVisible(false)]
> static void UnregisterFunction(String regKey)
> {
> MxCommands.Unregister(regKey);
> }
>
> #endregion
> }
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> "Willy Denoyette [MVP]" wrote:
>[color=green]
>>
>> "Jason Newell" <nospam@nospam.com> wrote in message
>> news:eCS0FVK5FHA.4036@TK2MSFTNGP11.phx.gbl...[color=darkred]
>> > Yeah I know it's always been default because it's bitten me in the
>> > rear-end a few times ;-). I honestly didn't think that they would have
>> > made a breaking change like that. So the question that still remains,
>> > did
>> > setting [ComVisible(true)] really solve the problem or was it something
>> > else?
>> >
>> >
>> > Jason Newell
>> >
>> >[/color]
>>
>> Pretty sure it was something else (my guess: missing public on the
>> class).
>>
>> Willy.
>>
>>
>>
>>
>>[/color][/color] | | |
P: n/a
|
Vish
Hi Willy,
I wrote this class as an added tool for ESRI's ArcMap Software. The
BaseCommand class is part of their ArcObjects pacakage. So i will not be
provide you with that class. Anyway the the functions of the class below was
called and successfully executed from ArcMap which is completely built on
COM. Anyway that is not to say that you are write about what you are saying.
I just maybe it will help m eunderstand whats happeneing better. I class
below successfully created a new toolbar button and executed on click. Please
let me know what you think.
-Vish
"Willy Denoyette [MVP]" wrote:
[color=blue]
> Sorry, but this is not a complete sample (missing BaseCommand), so there is
> lttle I can do with it, but trust me [ComVisible(true)] IS the default.
>
> I'm also not entirely clear on the purpose is of this class for a COM
> client, true, this object creatable from COM clients, but none of it's
> methods are callable.
>
>
> Willy.
>
> "Vish" <Vish@discussions.microsoft.com> wrote in message
> news:EBA6A147-26D1-4A45-8968-E5310CA2A179@microsoft.com...[color=green]
> > Hi,
> >
> > Ok. I am not sure why but it did fix the issue. Obviously y'all know more
> > on
> > this subject than i do. But i am posting my code below if y'all are still
> > interested.
> >
> > [ClassInterface(ClassInterfaceType.None)]
> > [Guid("8D0240AD-1BBE-4831-8214-39DD46A4A797")]
> > [ComVisible(true)]
> > public sealed class TestTool : BaseCommand
> > {
> > private IApplication m_app;
> >
> > public override void OnCreate(object hook)
> > {
> > if (hook != null)
> > {
> > if (hook is IMxApplication)
> > {
> > m_app = (IApplication)hook;
> > }
> > }
> > }
> >
> > public override void OnClick()
> > {
> > IMxDocument mxDoc = (IMxDocument)m_app.Document;
> > IActiveView activeView = mxDoc.ActiveView;
> > activeView.Extent = activeView.FullExtent;
> > activeView.Refresh();
> > }
> >
> > public TestTool()
> > {
> > base.m_category = "Vish's Test";
> > base.m_caption = "Full Extent C#";
> > base.m_message = "Zooms the display to its full extent";
> > base.m_toolTip = "Full Extent C#";
> > base.m_name = "Developer Samples_FullExtent C#";
> >
> > string[] res = GetType().Assembly.GetManifestResourceNames();
> > if (res.GetLength(0) > 0)
> > {
> > base.m_bitmap = new
> > System.Drawing.Bitmap(GetType().Assembly.GetManife stResourceStream(res[0]));
> > }
> > }
> >
> > #region Component Category Registration
> >
> > [ComRegisterFunction()]
> > [ComVisible(false)]
> > static void RegisterFunction(String regKey)
> > {
> > MxCommands.Register(regKey);
> > }
> >
> > [ComUnregisterFunction()]
> > [ComVisible(false)]
> > static void UnregisterFunction(String regKey)
> > {
> > MxCommands.Unregister(regKey);
> > }
> >
> > #endregion
> > }
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > "Willy Denoyette [MVP]" wrote:
> >[color=darkred]
> >>
> >> "Jason Newell" <nospam@nospam.com> wrote in message
> >> news:eCS0FVK5FHA.4036@TK2MSFTNGP11.phx.gbl...
> >> > Yeah I know it's always been default because it's bitten me in the
> >> > rear-end a few times ;-). I honestly didn't think that they would have
> >> > made a breaking change like that. So the question that still remains,
> >> > did
> >> > setting [ComVisible(true)] really solve the problem or was it something
> >> > else?
> >> >
> >> >
> >> > Jason Newell
> >> >
> >> >
> >>
> >> Pretty sure it was something else (my guess: missing public on the
> >> class).
> >>
> >> Willy.
> >>
> >>
> >>
> >>
> >>[/color][/color]
>
>
>[/color] | | |
P: n/a
|
Erik
Hi,
I have the same problem. If I put [ComVisible(true)] on my class and
methods, it compiles, but I can't use the methods.
As an experiment I created a default Class Library, checked the
"Register for COM interop" -button, and I got the same error message:
"Com_test.dll" does not contain any types that can be registered for
COM Interop.
/Erik | | |
P: n/a
|
Willy Denoyette [MVP]
"Erik" <erik.hermansson@bredband.net> wrote in message
news:1131957791.156261.16200@f14g2000cwb.googlegro ups.com...[color=blue]
> Hi,
>
> I have the same problem. If I put [ComVisible(true)] on my class and
> methods, it compiles, but I can't use the methods.
>
> As an experiment I created a default Class Library, checked the
> "Register for COM interop" -button, and I got the same error message:
> "Com_test.dll" does not contain any types that can be registered for
> COM Interop.
>
> /Erik
>[/color]
Please post your class. Note that this has nothing to do with the ComVisible
attribute (which is definately true by default).
Willy. | | |
P: n/a
|
Erik
In my experiment i created an empty class library, resulting in the
following code.
using System;
using System.Collections.Generic;
using System.Text;
namespace Com_test
{
public class Class1
{
}
}
Shouldn't it compile without an error, even with "Register for COM
interop" checked? | | |
P: n/a
|
Willy Denoyette [MVP]
"Erik" <erik.hermansson@bredband.net> wrote in message
news:1131979292.323552.25010@g47g2000cwa.googlegro ups.com...[color=blue]
> In my experiment i created an empty class library, resulting in the
> following code.
>
> using System;
> using System.Collections.Generic;
> using System.Text;
>
> namespace Com_test
> {
> public class Class1
> {
> }
> }
>
> Shouldn't it compile without an error, even with "Register for COM
> interop" checked?
>[/color]
This class will compile but cannot be registered for COM interop as it
doesn't have an explicit public empty constructor .
this ...
public class Class1
{
public Class1(){}
}
will do.
Willy. | | |
P: n/a
|
Vish
Hi Willy,
Since the class i had created did have a constructor explicitly defined, why
do you think i wasn't able to compile my class in 2.0
Thank You,
Vish
"Willy Denoyette [MVP]" wrote:
[color=blue]
>
> "Erik" <erik.hermansson@bredband.net> wrote in message
> news:1131979292.323552.25010@g47g2000cwa.googlegro ups.com...[color=green]
> > In my experiment i created an empty class library, resulting in the
> > following code.
> >
> > using System;
> > using System.Collections.Generic;
> > using System.Text;
> >
> > namespace Com_test
> > {
> > public class Class1
> > {
> > }
> > }
> >
> > Shouldn't it compile without an error, even with "Register for COM
> > interop" checked?
> >[/color]
>
> This class will compile but cannot be registered for COM interop as it
> doesn't have an explicit public empty constructor .
>
> this ...
> public class Class1
> {
> public Class1(){}
> }
>
> will do.
>
> Willy.
>
>
>[/color] | | |
P: n/a
|
Erik
Thank you for your answer, but I'm afraid that didn't help. Now the
code looks like this:
using System;
using System.Collections.Generic;
using System.Text;
namespace Com_test
{
public class Class1
{
public Class1() { }
}
}
but it still cannot be registered for COM interop. | | |
P: n/a
|
Willy Denoyette [MVP]
"Erik" <erik.hermansson@bredband.net> wrote in message
news:1132153125.974710.198340@o13g2000cwo.googlegr oups.com...[color=blue]
> Thank you for your answer, but I'm afraid that didn't help. Now the
> code looks like this:
>
> using System;
> using System.Collections.Generic;
> using System.Text;
>
> namespace Com_test
> {
> public class Class1
> {
> public Class1() { }
> }
> }
>
> but it still cannot be registered for COM interop.
>[/color]
It should, what error are you getting?
The simplest way to test this is compile the file from the command line
using:
csc /t:library filename.cs
and register with:
regasm /codebase /tlb filename.dll
unregister with:
regasm /unregister /tlb filename.dll
Willy. | | |
P: n/a
|
Willy Denoyette [MVP]
You said you couldn't register, now you are teling me you could't compile!
A C# class needs to obey a number of rules (imposed by COM), one of the is
a default public construcor, but there are others.
A public constructor is in general all you need to be able to create an
instance, that doesn't mean that methods are callable. As I said your class
can be instantiated, but your methods are not callable from a native COM
client itself, the fact it works in your case is because you methods
OnCreate and OnClick are not called from COM, they are called from the
container (they are event handlers right?) .
Willy.
"Vish" <Vish@discussions.microsoft.com> wrote in message
news:0F1A3AC5-818B-4E35-A545-5407FE3588CE@microsoft.com...[color=blue]
> Hi Willy,
>
> Since the class i had created did have a constructor explicitly defined,
> why
> do you think i wasn't able to compile my class in 2.0
>
> Thank You,
> Vish
>
>
> "Willy Denoyette [MVP]" wrote:
>[color=green]
>>
>> "Erik" <erik.hermansson@bredband.net> wrote in message
>> news:1131979292.323552.25010@g47g2000cwa.googlegro ups.com...[color=darkred]
>> > In my experiment i created an empty class library, resulting in the
>> > following code.
>> >
>> > using System;
>> > using System.Collections.Generic;
>> > using System.Text;
>> >
>> > namespace Com_test
>> > {
>> > public class Class1
>> > {
>> > }
>> > }
>> >
>> > Shouldn't it compile without an error, even with "Register for COM
>> > interop" checked?
>> >[/color]
>>
>> This class will compile but cannot be registered for COM interop as it
>> doesn't have an explicit public empty constructor .
>>
>> this ...
>> public class Class1
>> {
>> public Class1(){}
>> }
>>
>> will do.
>>
>> Willy.
>>
>>
>>[/color][/color] | | |
P: n/a
|
Vish
Hi Willy,
Yes, i wasnt able to compile. I am sorry if i had misrepresentd in
previously. Also my OnCreate and OnClick functions are in fact getting called
by event handlers. Can you let me know where i can read up on the rules my c#
class needs to foolow in order to be callable from COM.
Thank You,
Vish
"Willy Denoyette [MVP]" wrote:
[color=blue]
>
> "Erik" <erik.hermansson@bredband.net> wrote in message
> news:1132153125.974710.198340@o13g2000cwo.googlegr oups.com...[color=green]
> > Thank you for your answer, but I'm afraid that didn't help. Now the
> > code looks like this:
> >
> > using System;
> > using System.Collections.Generic;
> > using System.Text;
> >
> > namespace Com_test
> > {
> > public class Class1
> > {
> > public Class1() { }
> > }
> > }
> >
> > but it still cannot be registered for COM interop.
> >[/color]
>
> It should, what error are you getting?
>
> The simplest way to test this is compile the file from the command line
> using:
>
> csc /t:library filename.cs
> and register with:
> regasm /codebase /tlb filename.dll
> unregister with:
> regasm /unregister /tlb filename.dll
>
>
>
> Willy.
>
>
>[/color] | | |
P: n/a
|
Mark Harris
I hate dredging this up as its so old, but thought i'd clear this up. After
spending the past 3 days trying everything possible to get my C# code to work
in COM, i almost gave up until seeing this post.
To put it bluntly, the documentation is wrong.
The code i was using in 1.1 DID NOT WORK in 2.0. Simple test case below:
---------- BEGIN ITVTest.cs ----------
using System;
using System.Text;
using System.Runtime.InteropServices;
namespace comitvtest
{
[Guid("3A8E1A9D-206E-48cb-BD4F-0FE6D3155CDF")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public class ITVTest : IITVTest
{
public ITVTest()
{
throw new System.NotImplementedException();
}
public int GetCurrentHour()
{
return System.DateTime.Now.Hour;
}
}
}
---------- END ITVTest.cs ----------
---------- BEGIN IITVTest.cs ----------
using System;
using System.Runtime.InteropServices;
namespace comitvtest
{
[Guid("770A5441-1B1D-4847-91B5-B84EDDC1B647")]
interface IITVTest
{
int GetCurrentHour();
}
}
---------- END IITVTest.cs ----------
--- Project Setup ---
Goto Project -> Properties
Click the "Build" tab.
Select the Register for COM Interop option
Click the "Signing" tab.
Select "Sign the Assembly", from the file name select "<new>" give it a name
i used KeyPairing.snk with NO password
Build project
start -> run: cmd
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
H:\>c:
C:\>cd projects\com.itv.test
C:\Projects\com.itv.test\bin\Release>tlbexp com.itv.test.dll
Microsoft (R) .NET Framework Assembly to Type Library Converter 2.0.50727.42
Copyright (C) Microsoft Corporation. All rights reserved.
Assembly exported to 'C:\Projects\com.itv.test\bin\Release\com.itv.test .tlb'
C:\Projects\com.itv.test\bin\Release>regasm com.itv.test.dll
/tlb:com.itv.test.t
lb
Microsoft (R) .NET Framework Assembly Registration Utility 2.0.50727.42
Copyright (C) Microsoft Corporation 1998-2004. All rights reserved.
Assembly exported to
'C:\Projects\com.itv.test\bin\Release\com.itv.test .tlb', an
d the type library was registered successfully
--- Visual Basic 6 Test ---
Create new Standard EXE project
Goto to Project menu, select References
Find the com assembly in references list (com_itv_test), select, and hit OK
View the object browser
Types are visible here. (can also do the same with with Visual FoxPro's
Class Explorer and open the TLB file.)
--- The Proof ---
Now try it without the ComVisible attribute.
- Mark Harris
C:\Projects\com.itv.test>cd bin/release
"Willy Denoyette [MVP]" wrote:
[color=blue]
> Sorry, but this is not a complete sample (missing BaseCommand), so there is
> lttle I can do with it, but trust me [ComVisible(true)] IS the default.
>
> I'm also not entirely clear on the purpose is of this class for a COM
> client, true, this object creatable from COM clients, but none of it's
> methods are callable.
>
>
> Willy.
>
> "Vish" <Vish@discussions.microsoft.com> wrote in message
> news:EBA6A147-26D1-4A45-8968-E5310CA2A179@microsoft.com...[color=green]
> > Hi,
> >
> > Ok. I am not sure why but it did fix the issue. Obviously y'all know more
> > on
> > this subject than i do. But i am posting my code below if y'all are still
> > interested.
> >
> > [ClassInterface(ClassInterfaceType.None)]
> > [Guid("8D0240AD-1BBE-4831-8214-39DD46A4A797")]
> > [ComVisible(true)]
> > public sealed class TestTool : BaseCommand
> > {
> > private IApplication m_app;
> >
> > public override void OnCreate(object hook)
> > {
> > if (hook != null)
> > {
> > if (hook is IMxApplication)
> > {
> > m_app = (IApplication)hook;
> > }
> > }
> > }
> >
> > public override void OnClick()
> > {
> > IMxDocument mxDoc = (IMxDocument)m_app.Document;
> > IActiveView activeView = mxDoc.ActiveView;
> > activeView.Extent = activeView.FullExtent;
> > activeView.Refresh();
> > }
> >
> > public TestTool()
> > {
> > base.m_category = "Vish's Test";
> > base.m_caption = "Full Extent C#";
> > base.m_message = "Zooms the display to its full extent";
> > base.m_toolTip = "Full Extent C#";
> > base.m_name = "Developer Samples_FullExtent C#";
> >
> > string[] res = GetType().Assembly.GetManifestResourceNames();
> > if (res.GetLength(0) > 0)
> > {
> > base.m_bitmap = new
> > System.Drawing.Bitmap(GetType().Assembly.GetManife stResourceStream(res[0]));
> > }
> > }
> >
> > #region Component Category Registration
> >
> > [ComRegisterFunction()]
> > [ComVisible(false)]
> > static void RegisterFunction(String regKey)
> > {
> > MxCommands.Register(regKey);
> > }
> >
> > [ComUnregisterFunction()]
> > [ComVisible(false)]
> > static void UnregisterFunction(String regKey)
> > {
> > MxCommands.Unregister(regKey);
> > }
> >
> > #endregion
> > }
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > "Willy Denoyette [MVP]" wrote:
> >[color=darkred]
> >>
> >> "Jason Newell" <nospam@nospam.com> wrote in message
> >> news:eCS0FVK5FHA.4036@TK2MSFTNGP11.phx.gbl...
> >> > Yeah I know it's always been default because it's bitten me in the
> >> > rear-end a few times ;-). I honestly didn't think that they would have
> >> > made a breaking change like that. So the question that still remains,
> >> > did
> >> > setting [ComVisible(true)] really solve the problem or was it something
> >> > else?
> >> >
> >> >
> >> > Jason Newell
> >> >
> >> >
> >>
> >> Pretty sure it was something else (my guess: missing public on the
> >> class).
> >>
> >> Willy.
> >>
> >>
> >>
> >>
> >>[/color][/color]
>
>
>[/color] | | Post your reply Help answer this question
Didn't find the answer to your C# / C Sharp question?
| | Question stats - viewed: 5475
- replies: 26
- date asked: Nov 17 '05
|