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

Posted

技术标签:

【中文标题】从 C# 访问 COM 对象的最佳方法【英文标题】:Best way to access COM objects from C# 【发布时间】:2010-10-12 18:13:07 【问题描述】:

我计划使用作为 COM 对象公开的各种对象。为了使它们更易于使用,我想将它们包装为 C# 对象。最好的方法是什么?

【问题讨论】:

C# 语言“产品经理”Mads Torgersen 在上一次 DeepFriedBytes 播客关于 C# 时说,他们添加或正在添加某些功能以简化与 COM 的互操作。如果我能记得那是什么…… 我认为您指的是 C# 4.0 中的“动态”变量类型。这个新关键字使它变得更容易,但在 C# 中已经可以实现。 【参考方案1】:

如果库已经注册,您可以执行以下步骤让 Visual Studio 为您生成互操作程序集:

打开您的 Visual Studio 项目。 右键单击“参考”(在解决方案资源管理器中的项目下方)并选择“添加参考”。 选择 COM 选项卡。 (如果您没有看到这一点,则说明您的项目类型不支持 COM。) 选择您希望与之互操作的组件。 选择“确定”。

这将是一个类或一组 C# 类,用普通 C# 类包装所有 COM 接口内容。然后,您只需像使用任何其他 C# 库一样使用它。如果引用的导入运行良好,您可以像任何其他引用一样探索它,并且方法/结构/类/常量应该显示在该命名空间和智能感知中。

这至少可以帮助您入门。如果将其部署在企业环境中或您可以控制的环境中,这可能就是您所需要的。

【讨论】:

在不使用 Visual Studio 的情况下有没有办法做到这一点?我正在使用 Visual Studio Code,不认为它具有内置功能,但想知道这是否可以通过任何其他方式完成? 我不知道。当我写这篇文章时,.net 远没有今天成熟。我怀疑有一些工具可以从命令行执行此操作。我建议在这里尝试一些技术:docs.microsoft.com/en-us/dotnet/framework/interop/…【参考方案2】:

您可以(最初)只导入引用。如果您需要更多控制(或从 VS 的导入中获取错误),您可以在 windows sdk 中使用 tlbimp。这将创建互操作程序集。您可以从元数据中获取类定义。

编辑:如果您想使用 64 位,这实际上要复杂得多

【讨论】:

为什么它更难或不同?只需使用 x64 .Net 工具集中的 tlbimp 我的猜测是任何使用 32 位架构的依赖程序集。我知道使用 32 位编译的 COM 互操作程序集的 64 位版本的应用程序不起作用,反之亦然。我一直认为 x64 可以运行任何一种架构,但显然不是这样。

以上是关于从 C# 访问 COM 对象的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

从 Excel 访问 WCF 服务的最佳方式是啥?

通过 C# 访问远程 COM 对象

用 C# 编写的 COM 对象 - 获取类,但不获取方法

使 C++ 软件包和 C# 包访问相同枚举/常量整数的最佳方法

在 C# 4 中使用动态类型访问 javascript 对象的属性

使用 COM 互操作从非托管 C++ 访问 c# 属性