473,795 Members | 3,457 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

COM Interop question in .NET 2.0

Hi,

I am trying to expose my .NET 2.0 class as a COM type using the following
attributes for the attributes

[ClassInterface( ClassInterfaceT ype.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
Nov 17 '05
26 10680
Thank you for your answer, but I'm afraid that didn't help. Now the
code looks like this:

using System;
using System.Collecti ons.Generic;
using System.Text;

namespace Com_test
{
public class Class1
{
public Class1() { }
}
}

but it still cannot be registered for COM interop.

Nov 17 '05 #21

"Erik" <er************ *@bredband.net> wrote in message
news:11******** **************@ o13g2000cwo.goo glegroups.com.. .
Thank you for your answer, but I'm afraid that didn't help. Now the
code looks like this:

using System;
using System.Collecti ons.Generic;
using System.Text;

namespace Com_test
{
public class Class1
{
public Class1() { }
}
}

but it still cannot be registered for COM interop.


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.
Nov 17 '05 #22
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" <Vi**@discussio ns.microsoft.co m> wrote in message
news:0F******** *************** ***********@mic rosoft.com...
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:

"Erik" <er************ *@bredband.net> wrote in message
news:11******** *************@g 47g2000cwa.goog legroups.com...
> In my experiment i created an empty class library, resulting in the
> following code.
>
> using System;
> using System.Collecti ons.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.

Nov 17 '05 #23
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:

"Erik" <er************ *@bredband.net> wrote in message
news:11******** **************@ o13g2000cwo.goo glegroups.com.. .
Thank you for your answer, but I'm afraid that didn't help. Now the
code looks like this:

using System;
using System.Collecti ons.Generic;
using System.Text;

namespace Com_test
{
public class Class1
{
public Class1() { }
}
}

but it still cannot be registered for COM interop.


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.

Nov 17 '05 #24
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( ClassInterfaceT ype.AutoDual)]
[ComVisible(true )]
public class ITVTest : IITVTest
{
public ITVTest()
{
throw new System.NotImple mentedException ();
}

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.it v.test

C:\Projects\com .itv.test\bin\R elease>tlbexp com.itv.test.dl l
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\co m.itv.test\bin\ Release\com.itv .test.tlb'

C:\Projects\com .itv.test\bin\R elease>regasm com.itv.test.dl l
/tlb:com.itv.tes t.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\co m.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:
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" <Vi**@discussio ns.microsoft.co m> wrote in message
news:EB******** *************** ***********@mic rosoft.com...
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( ClassInterfaceT ype.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)h ook;
}
}
}

public override void OnClick()
{
IMxDocument mxDoc = (IMxDocument)m_ app.Document;
IActiveView activeView = mxDoc.ActiveVie w;
activeView.Exte nt = activeView.Full Extent;
activeView.Refr esh();
}

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_FullExt ent C#";

string[] res = GetType().Assem bly.GetManifest ResourceNames() ;
if (res.GetLength( 0) > 0)
{
base.m_bitmap = new
System.Drawing. Bitmap(GetType( ).Assembly.GetM anifestResource Stream(res[0]));
}
}

#region Component Category Registration

[ComRegisterFunc tion()]
[ComVisible(fals e)]
static void RegisterFunctio n(String regKey)
{
MxCommands.Regi ster(regKey);
}

[ComUnregisterFu nction()]
[ComVisible(fals e)]
static void UnregisterFunct ion(String regKey)
{
MxCommands.Unre gister(regKey);
}

#endregion
}






"Willy Denoyette [MVP]" wrote:

"Jason Newell" <no****@nospam. com> wrote in message
news:eC******** ******@TK2MSFTN GP11.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.



Jan 25 '06 #25
The default ComVisible attribute value did not change, what did change in
VS2005 was the AssemblyInfo.cs file which now contains [assembly:
ComVisible(fals e)]. But, the default (that is whan the attribute is not
specified) is still true.
Willy.

"Mark Harris" <Mark Ha****@discussi ons.microsoft.c om> wrote in message
news:DB******** *************** ***********@mic rosoft.com...
|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( ClassInterfaceT ype.AutoDual)]
| [ComVisible(true )]
| public class ITVTest : IITVTest
| {
| public ITVTest()
| {
| throw new System.NotImple mentedException ();
| }
|
| 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.it v.test
|
| C:\Projects\com .itv.test\bin\R elease>tlbexp com.itv.test.dl l
| 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\co m.itv.test\bin\ Release\com.itv .test.tlb'
|
| C:\Projects\com .itv.test\bin\R elease>regasm com.itv.test.dl l
| /tlb:com.itv.tes t.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\co m.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:
|
| > 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" <Vi**@discussio ns.microsoft.co m> wrote in message
| > news:EB******** *************** ***********@mic rosoft.com...
| > > 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( ClassInterfaceT ype.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)h ook;
| > > }
| > > }
| > > }
| > >
| > > public override void OnClick()
| > > {
| > > IMxDocument mxDoc = (IMxDocument)m_ app.Document;
| > > IActiveView activeView = mxDoc.ActiveVie w;
| > > activeView.Exte nt = activeView.Full Extent;
| > > activeView.Refr esh();
| > > }
| > >
| > > 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_FullExt ent C#";
| > >
| > > string[] res =
GetType().Assem bly.GetManifest ResourceNames() ;
| > > if (res.GetLength( 0) > 0)
| > > {
| > > base.m_bitmap = new
| > >
System.Drawing. Bitmap(GetType( ).Assembly.GetM anifestResource Stream(res[0]));
| > > }
| > > }
| > >
| > > #region Component Category Registration
| > >
| > > [ComRegisterFunc tion()]
| > > [ComVisible(fals e)]
| > > static void RegisterFunctio n(String regKey)
| > > {
| > > MxCommands.Regi ster(regKey);
| > > }
| > >
| > > [ComUnregisterFu nction()]
| > > [ComVisible(fals e)]
| > > static void UnregisterFunct ion(String regKey)
| > > {
| > > MxCommands.Unre gister(regKey);
| > > }
| > >
| > > #endregion
| > > }
| > >
| > >
| > >
| > >
| > >
| > >
| > >
| > >
| > >
| > >
| > >
| > >
| > >
| > >
| > >
| > >
| > > "Willy Denoyette [MVP]" wrote:
| > >
| > >>
| > >> "Jason Newell" <no****@nospam. com> wrote in message
| > >> news:eC******** ******@TK2MSFTN GP11.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.
| > >>
| > >>
| > >>
| > >>
| > >>
| >
| >
| >
Jan 25 '06 #26


Jason, if you could e-mail me at my e-mail address that would be
wonderful.
Sara

*** Sent via Developersdex http://www.developersdex.com ***
Feb 4 '06 #27

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

0
2363
by: roy | last post by:
I try to call com written in VB 6.0. When I use VS.net Studio to do the debuging, some time it works fine, some time I got the following message: Server Error in '/GISOnlineReservation' Application. ----------------------------------------------------------- --------------------- Configuration Error Description: An error occurred during the processing of a
0
1570
by: roy | last post by:
I try to call com written in VB 6.0., some time it works fine, some time I got the following message: Server Error in '/GISOnlineReservation' Application. ----------------------------------------------------------- --------------------- Configuration Error Description: An error occurred during the processing of a configuration file required to service this request.
0
2291
by: keefah | last post by:
Hi, I'm writing a C# web app that uses Outlook to send email. I use a reference to the Microsoft Outlook 11.0 Object Library, but it's giving me problems. I tracked down some stuff on the Net about the global assembly cache (GAC) and primary interop assemblies (PIA) and so forth, and did all the recommendations, in terms of tweeking Office, installing the .NET Office stuff for framework 1.1, etc. I got it to the point where it compiles ok,...
0
2793
by: lacour | last post by:
I can't seem to figure out the difference between adding a COM dll reference in VS2003 and by using TLBIMP. I have a COM dll that references another COM dll, and I want the syntax of my interop-filenames to be interop.<NameOfCOMDLL>.dll I now make the first interop file tlbimp COM1.dll /out:interop.COM1.dll /namespace:COM1
1
1999
by: Nadav | last post by:
Hi, Introduction *************** I have a system build of a collection of 'Native COM objects' and '.NET COM interop' objects, all of the COM objects are managed through a 'Native COM' layer, this layer manage the underlying COM Objects and upon request, provide a pointer to those objects to the 'API Consumer', following is an illustration of the system: API Consumer ( Native C++/C# ) || ******************************************* * ...
8
3426
by: Rob Edwards | last post by:
When trying to add the Microsoft CDO for Exchange Management Library (aka CDOEXM.dll) I receive the following message: "A reference to 'Microsoft CDO for Exchange Management Library' could not be added. Converting the type library to a .Net assembly failed. A depended type library 'CDO' could not be converted to a .NET assembly. A dependent type library 'ADODB' could not be converted to a .NET assembly. Item has already been added." ...
7
10964
by: R Reyes | last post by:
Can someone please explain to me why I can't get the MS Word Interop assembly to work in my VS2005 project? I'm trying to manipulate MS Word from my Web Form application and I can't get passed this screen below. Please help, thanks in advance... Configuration Error Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify...
2
7305
by: JC | last post by:
Anybody knows what problem has this code? I think, in the Garbage Collector? You know the Solution? The program in the test's case, whit 350 contacts, run OK before number 86. The error is a "Array index out of bounds". Microsoft.Office.Interop.Outlook._Application olApp = new Microsoft.Office.Interop.Outlook.ApplicationClass(); Microsoft.Office.Interop.Outlook._NameSpace olNs = olApp.GetNamespace("MAPI");
1
2872
by: allbelonging | last post by:
C#.Net Outlook 2003 automation (programmatically) with Office.Interop.Outlook Problem: I have my outlook 2003 configured with multiple mailbox on my local machine. I want to specify the mailbox and server (Exchange server mail box) to connect and then save the mailitems(from Inbox or any other folder) based on a filter to a*.msg file. I want to achieve this using only one Interop dll if this is possible. Tried so far:
0
2058
by: Tina | last post by:
I've gotten this before where it says there is a problem with Interop.MSDASC but I can't remember what causes this. This is a 1.1 app I'm trying to debug in vs2005. It was running yesterday just fine. Help! T Server Error in '/VT.Users' Application. -------------------------------------------------------------------------------- Configuration Error
0
9672
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
10437
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
10214
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
1
10164
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
0
9042
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
1
7538
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
6780
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
5563
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
2
3723
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.