【问题标题】:Calling a c# COM server dll from a C# client app从 C# 客户端应用程序调用 c# COM 服务器 dll
【发布时间】:2012-04-28 12:30:41
【问题描述】:

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

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

这可能吗?

谢谢

【问题讨论】:

    标签: c# dll com interop


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

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

      详细Article

      【讨论】:

      • 这不起作用,因为 tlbimp.exe 拒绝为 NET 程序集创建 CCW。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-30
        • 1970-01-01
        • 1970-01-01
        • 2010-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多