2012-04-17 154 views
0

我得到了一个桌面应用程序,它使用C#中编写的小型DLL作为COM对象注册,以从Active Directory收集一些信息。该应用程序是用C++编写的,它工作正常。我想在C#中编写一个小应用程序,它将调用相同的已注册DLL的方法(某种测试工具),但不知道如何在编译时不引用COM DLL的情况下执行此操作(我真的需要使用COM注册DLL)从C#客户端应用程序调用c#COM服务器DLL

I followed this article,设法实例化对象,但我不能将实例强制转换为从IDL创建的接口。调试器也知道所有成员显示的实例的确切类型。我怀疑这是由于DLL也加载在CLR中。

这甚至可能吗?

谢谢

回答

0

您可以从C#项目中使用COM组件。一般步骤如下:

找到要使用的COM组件并注册它。使用regsvr32.exe注册或取消注册COM DLL。

向项目添加对COM组件或类型库的引用。

当您添加引用时,Visual Studio将使用类型库作为输入的Tlbimp.exe(类型库导入程序)输出.NET Framework互操作程序集。该程序集也称为运行时可调用包装程序(RCW),包含用于包装类型库中的COM类和接口的托管类和接口。 Visual Studio将向生成的程序集添加一个引用。

创建一个在RCW中定义的类的实例。这反过来又创建了COM对象的一个​​实例。

与使用其他托管对象一样使用对象。当垃圾收集回收对象时,COM对象的实例也从内存中释放。

有关更多信息,请参见将COM组件公开到.NET Framework。

详细Article

+0

这并不工作,因为tlbimp.exe是拒绝创建CCW为.NET程序集在那篇文章中涉及的所有乱七八糟的。 – fiamista 2012-04-17 09:18:00

1

你不能。 IDE将拒绝让您添加对类型库的引用。你可以通过使用后期绑定来欺骗它。但是这仍然不能欺骗CLR,它不会创造CCW和RCW。您需要一个本地客户端,如C++或脚本语言才能真正实现COM特定路径。

没有意义,只是直接使用程序集引用,并使用普通的C#代码来测试它。

0

我会建议你使用.NET 4.0 dynamic类型,而不是与反思你提到