使用C#访问COM对象的最佳方法

40

我计划使用多个作为COM对象公开的对象。 为了更容易使用它们,我想将它们封装为C#对象。 这方面最好的方法是什么?


C# 的“产品经理”Mads Torgersen在最近的 DeepFriedBytes podcast 中表示,他们正在添加某些功能以简化与 COM 的交互。如果我能记得是什么就好了…… - f3lix
我认为你指的是C# 4.0中引入的“dynamic”变量类型。这个新关键字使它更容易,但在C#中已经是可能的。 - Robert P
2个回答

44
如果库已经注册,您可以执行以下步骤,让Visual Studio为您生成一个互操作程序集:
  • 打开您的Visual Studio项目。
  • 右键单击'References'(在Solution Explorer中位于项目下方),然后选择'Add Reference'。
  • 选择COM选项卡。(如果您看不到此选项卡,则表示您有一个不支持COM的项目类型。)
  • 选择要与之互操作的组件。
  • 选择“确定”。

这将是一组类或C#类,用普通的C#类包装所有的COM接口内容。 然后,您只需要像使用任何其他C#库一样使用它。 如果引用导入成功,则可以像处理任何其他引用一样浏览它,方法/结构体/类/常量应该显示在该名称空间和Intellisense中。

至少这将让您入门。 如果这被部署在一个企业环境或您可以控制的环境中,则这可能是您所需的全部。


1
有没有不使用 Visual Studio 的方法来实现这个?我正在使用 Visual Studio Code,不认为它内置了这种能力,但想知道是否有其他方式可以实现? - Gautam Kumar Samal
2
我不知道。当我写这篇文章时,.net比现在不成熟得多。我猜测有一些工具可以从命令行完成这个任务。我建议尝试这里介绍的一些技术:https://learn.microsoft.com/en-us/dotnet/framework/interop/how-to-create-com-wrappers - Robert P

5
您可以(最初)只导入参考文献。如果您需要更多控制(或从VS的导入中获取错误),您可以使用Windows SDK中的tlbimp。这将创建Interop程序集。您可以从元数据中获取类定义。
编辑:如果您想要与64位一起工作,实际上这会更加复杂。

为什么这有什么难度或不同之处呢?只需使用来自x64 .Net工具集的tlbimp即可。 - Tomer W
我的猜测是任何使用32位架构的依赖程序集。我知道使用32位编译的COM Interop程序集的64位应用程序版本不起作用,反之亦然。我一直以为x64可以运行任何架构,但显然并非如此。 - Anthony Mason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接