从 C# 客户端应用调用 c# COM 服务器 dll
本文关键字:COM 服务器 dll 调用 客户端 应用 | 更新日期: 2023-09-27 18:31:17
我得到了一个桌面应用程序,它使用一个用C#编写的小DLL注册为COM对象,从Active Directory收集一些信息。该应用程序是用C++编写的,它工作正常。我想用 C# 编写一个小应用程序,它将调用相同的注册 DLL 的方法(一种测试工具),但在编译时如果不引用 COM DLL,就无法弄清楚如何做到这一点(我真的需要使用 COM 注册的 dll)
我遵循了这篇文章,设法实例化了对象,但我无法将实例转换为从 IDL 创建的接口。此外,调试器知道显示所有成员的实例的确切类型。我怀疑这是由于 DLL 也加载在 CLR 中。
这可能吗?
谢谢
你不能。 IDE 将拒绝您添加对类型库的引用。 您可以通过使用后期绑定来欺骗它。 但这仍然不能愚弄 CLR,它不会同时创建 CCW 和 RCW。 你将需要一个本机客户端(如C++或脚本语言)来真正执行特定于 COM 的路径。
没有意义,直接使用程序集引用并使用普通的 C# 代码对其进行测试即可。
可以使用 C# 项目中的 COM 组件。一般步骤如下:
找到要使用的 COM 组件并注册它。使用 regsvr32.exe 注册或取消注册 COM DLL。
向项目添加对 COM 组件或类型库的引用。
添加引用时,Visual Studio 使用 Tlbimp.exe(类型库导入器),它将类型库作为输入,以输出 .NET Framework 互操作程序集。程序集也称为运行时可调用包装器 (RCW),包含包装类型库中的 COM 类和接口的托管类和接口。Visual Studio 将指向项目添加对生成的程序集的引用。
创建在 RCW 中定义的类的实例。这反过来又会创建 COM 对象的实例。
像使用其他托管对象一样使用该对象。当垃圾回收回收对象时,COM 对象的实例也会从内存中释放。
有关更多信息,请参见向 .NET Framework 公开 COM 组件。
详细文章
我建议您使用 .NET 4.0 dynamic
类型,而不是在您提到的那篇文章中处理反射的所有混乱