【问题标题】:How do I load a COM instance in C#如何在 C# 中加载 COM 实例
【发布时间】:2021-08-01 13:16:16
【问题描述】:

我有 COM idl 定义文件,并且我有一个 VB 项目来演示如何通过 COM 通过应用程序进行通信。

不幸的是,我无法直接将 VB 代码移植到 C#。 COM 是用 C++ 编写的,并通过其程序 id 进行引用

如何从 C# 实例化 COM 并从那里调用函数?

这是vb代码

  Dim DrCephPatient As Object
  SampleCom = CreateObject("Sample.SampleCOM")

  SampleCom.Attribute1= "Hello"
  SampleCom.Method1(1)

另外,因为我有 IDL 定义,所以我有可以用来访问的 UUID。

我需要阅读哪些资源才能完成这项工作?

【问题讨论】:

标签: c# com interop


【解决方案1】:

您只需向您的 C# 项目添加一个 COM 引用。

Add Reference 对话窗口的 COM 选项卡列出了所有可供引用的 COM 组件。如果要添加对包含内部清单的已注册 COM DLL 的引用,请先取消注册 DLL。否则,Visual Studio 会将程序集引用添加为 ActiveX 控件而不是本机 DLL。

如果项目类型不支持 COM,则该选项卡不会出现在“引用管理器”对话框中。在How to: Add or remove references by using the Reference Manager 文章中了解更多信息。

添加 COM 引用后,您可以将组件用作常规 .net 类(使用幕后自动生成的互操作库)。

【讨论】:

    【解决方案2】:

    使用 C#,您可以通过使用Type.GetTypeFromProgID()Activator 类和使用dynamic 类型来使其像 VB 脚本代码一样执行。不过,我不一定更喜欢这个。最好将 COM 引用添加到您的项目中。在我使用的示例中,Word 进程耗尽(是一个 .exe),因此它可以与 32 位或 64 位版本的运行时一起使用。但是,对于进程内服务器 (.dll),您的代码位数和服务器需要匹配(32 位或 64 位)。但是,为了快速测试,这有时可以完成工作。

    using System;
    
    class Test {
       public static void Main(string[] args) {
    
          Type t = Type.GetTypeFromProgID("Word.Application");
    
          dynamic word = Activator.CreateInstance(t);
    
          Console.WriteLine("Word title:" + word.Name);
    
          word.Quit(); // otherwise hanging reference ... is Word API specific
       }
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用 SerialPort 类 https://docs.microsoft.com/en-us/dotnet/api/system.io.ports.serialport?view=dotnet-plat-ext-5.0

      基本上适用于 Open、Write/Read 和 Close 函数,但它是用 C# 编写的,我猜这不是你要找的

      还有这个关于 VB 的文章列表可以帮助你 https://docs.microsoft.com/en-us/dotnet/visual-basic/developing-apps/programming/computer-resources/accessing-the-computer-s-ports

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-14
        • 1970-01-01
        • 1970-01-01
        • 2020-08-29
        • 2015-10-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多