COM Interop question in .NET 2.0

G

Guest

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
 
N

Nicholas Paldino [.NET/C# MVP]

Vish,

Is it an error in the build process, or the registration process?
 
J

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
 
W

Willy Denoyette [MVP]

Vish said:
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.
 
G

Guest

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 said:
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

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
 
G

Guest

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 said:
Vish,

Is it an error in the build process, or the registration process?


--
- Nicholas Paldino [.NET/C# MVP]
- (e-mail address removed)

Vish said:
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
 
G

Guest

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 said:
Vish said:
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.
 
W

Willy Denoyette [MVP]

Can't be the reason as the default for ComVisible is still true.

Willy.

Vish said:
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 said:
Vish said:
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.
 
J

Jason Newell

Vish,

Willy is correct per documentation:
http://msdn2.microsoft.com/en-us/library/k5a02kac(en-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

Can't be the reason as the default for ComVisible is still true.

Willy.

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


:

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.
 
W

Willy Denoyette [MVP]

Jason Newell said:
Vish,

Willy is correct per documentation:
http://msdn2.microsoft.com/en-us/library/k5a02kac(en-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

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.
 
J

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

Vish,

Willy is correct per documentation:
http://msdn2.microsoft.com/en-us/library/k5a02kac(en-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


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.
 
W

Willy Denoyette [MVP]

Jason Newell said:
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.
 
G

Guest

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.GetManifestResourceStream(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 said:
Jason Newell said:
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.
 
W

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 said:
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.GetManifestResourceStream(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 said:
Jason Newell said:
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.
 
G

Guest

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 said:
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 said:
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.GetManifestResourceStream(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 said:
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.
 
E

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
 
W

Willy Denoyette [MVP]

Erik said:
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

Please post your class. Note that this has nothing to do with the ComVisible
attribute (which is definately true by default).

Willy.
 
E

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?
 
W

Willy Denoyette [MVP]

Erik said:
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?

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.
 
G

Guest

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top