从c#客户端应用程序调用c#COM服务器dll

从c#客户端应用程序调用c#COM服务器dll,c#,dll,com,interop,C#,Dll,Com,Interop,我得到了一个桌面应用程序,它使用一个用C编写的小DLL,注册为COM对象,从Active Directory收集一些信息。应用程序是用C++编写的,运行良好。我想用C#编写一个小应用程序,它将调用相同的已注册DLL的方法(一种测试工具),但如果不在编译时引用COM DLL(我真的需要使用COM已注册的DLL),就无法理解如何执行此操作 ,试图实例化该对象,但我无法将该实例强制转换到从IDL创建的接口。调试器还知道实例的确切类型,并显示所有成员。我怀疑这是因为DLL也加载在CLR中 这可能吗 谢谢

我得到了一个桌面应用程序,它使用一个用C编写的小DLL,注册为COM对象,从Active Directory收集一些信息。应用程序是用C++编写的,运行良好。我想用C#编写一个小应用程序,它将调用相同的已注册DLL的方法(一种测试工具),但如果不在编译时引用COM DLL(我真的需要使用COM已注册的DLL),就无法理解如何执行此操作

,试图实例化该对象,但我无法将该实例强制转换到从IDL创建的接口。调试器还知道实例的确切类型,并显示所有成员。我怀疑这是因为DLL也加载在CLR中

这可能吗


谢谢

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

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

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

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

创建在RCW中定义的类的实例。这又会创建COM对象的实例

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

有关更多信息,请参阅向.NET Framework公开COM组件


详细的

你不能。IDE将拒绝您添加对类型库的引用。你可以用后期绑定来愚弄它。但这仍然不能愚弄CLR,它不会同时创建CCW和RCW。您需要一个本地客户机,如C++或脚本语言来真正地执行COM特定路径。
没有任何意义,直接使用程序集引用并使用普通的C#代码来测试它。

我建议您使用.NET 4.0
动态
类型,而不是您提到的那篇文章中处理反射的所有混乱

这不起作用,因为tlbimp.exe拒绝为网络程序集创建CCW。