通过 COM 为 C++ 客户端公开 C#

Posted

技术标签:

【中文标题】通过 COM 为 C++ 客户端公开 C#【英文标题】:Exposing C# via COM for C++ Client 【发布时间】:2009-07-01 09:05:01 【问题描述】:

我们正在考虑通过 COM 向 C++ 客户端公开一些 C# 类型。我们可以期望在项目的整个生命周期中遇到哪些问题?例如。如何管理版本控制?

关于版本控制,从阅读this 看来,我们应该装饰我们的类型以使用[ClassInterface(ClassInterfaceType.None)] 公开并使用显式接口。这样,我假设我们完全控制将向 COM 客户端公开的接口。

提前致谢。

【问题讨论】:

【参考方案1】:

由于您使用的是 C++ 客户端,因此您绝对应该使用显式接口进行早期绑定。 Dispatch 接口在使用脚本客户端(如 VBS)时很有用,但它们对 C++ 客户端很少有用。

对接口进行版本化的唯一方法是创建一个新接口(可能从原始接口继承)。使用显式接口时,您可以完全控制此过程。

这意味着您应该为打算通过 COM 公开的每个类创建一个接口。不要忘记用 ComVisible 和 Guid 属性标记每个接口和类。此外,您所有的类都必须有一个默认构造函数。

【讨论】:

只有他想用 CoCreateInstance 实例化的类才需要有默认构造函数并暴露给 COM。如果他只想要一个工厂方法,那么实现接口的类不需要暴露 COM 并且有一个默认构造函数。 工厂方法在哪里? 我的意思是你可以有几个公开的类,这些类将有多个工厂或检索方法返回一些与这些类无关的接口。这些类需要公开,但实现这些返回接口的类不需要。【参考方案2】:

您必须阅读有关 GUID 属性 (including this) 以保持二进制兼容性并仅在必要时重建客户端。

另外,您可能对 helps reduce registry pollution 的 ComVisible 属性感兴趣。

【讨论】:

【参考方案3】:

要完全控制 COM 接口,请在 MIDL 中定义它们。在 C++ 项目中使用这些接口构建类型库,然后将类型库导入 C# 并实现接口。

这种方法对于编组不是很简单的复杂接口很有用。

版本应该以 COM 样式完成,更改 GUID 并添加新的或继承的接口。

【讨论】:

以上是关于通过 COM 为 C++ 客户端公开 C#的主要内容,如果未能解决你的问题,请参考以下文章

如何将 C# 客户端 RPC 写入远程本机 C++ 服务器?

是否有可能知道哪个 .dll 称为 C# 服务?即使调用首先通过 COM 层?

WriteFile() 块(通过命名管道从 C++ 客户端写入 C# 服务器)

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

互操作:具有 C# COM 服务器字节数组参数的 C++ COM 客户端 - 数组是复制入/出还是直接访问?

将 helpstring 属性应用于通过 COM 接口公开的 C# 属性