0

我有一个桌面应用程序,它使用一个用 C# 编写的小 DLL,注册为一个 COM 对象,以从 Active Directory 收集一些信息。该应用程序是用 C++ 编写的,运行良好。我想用 C# 编写一个小应用程序,它会调用相同的注册 DLL 方法(一种测试工具),但如果不在编译时引用 COM DLL,我不知道如何做到这一点(我真的需要使用COM 注册的 dll)

我按照这篇文章,设法实例化了对象,但我无法将实例转换为从 IDL 创建的接口。调试器还知道显示所有成员的实例的确切类型。我怀疑这是因为 DLL 也加载到了 CLR 中。

这甚至可能吗?

谢谢

4

3 回答 3

1

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

没有意义,直接使用程序集引用,用普通的C#代码测试一下。

于 2012-04-17T07:19:29.157 回答
0

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

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

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

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

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

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

有关详细信息,请参阅向 .NET Framework 公开 COM 组件。

详细文章

于 2012-04-17T07:06:22.823 回答
0

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

于 2012-06-06T14:10:02.773 回答