如何使用 C++ 封装的 COM 接口部署 C# 库?

Posted

技术标签:

【中文标题】如何使用 C++ 封装的 COM 接口部署 C# 库?【英文标题】:How to deploy C# library with COM interface wrapped in C++? 【发布时间】:2014-03-07 08:21:48 【问题描述】:

我创建了 C# 库,但后来发现某些非托管 C++ 解决方案也需要它。我创建了 COM 接口(提取接口、添加 GUID、创建密钥、注册等)。

我创建了使用 tlb 文件的 C++ 库,并创建了 tlh 文件。目前我正在创建一些简单的 UI 来检查这个包装器是否有效。我的问题是——我应该向客户提供什么,因为我对 COM 对象的这个“签名”过程有疑问。我现在必须部署 - 一个 C# 库及其用 C++ 编写的包装器(使用 .h、.lib 和 .dll - 也许还有更多?)。我不知道它是否会启动,当它没有在用户系统中注册时?如何处理当用户获得一些文件时他能够立即使用它们?

【问题讨论】:

【参考方案1】:

不,您的客户不需要这个“C++ 包装器”。他们可以很容易地自己生成一个,例如 MSVC++ 中的#import 指令会自动生成。无论如何,他们没有必要使用 C++,COM 可以在任何语言中使用。如果您包含任何内容,请考虑使用演示程序来演示界面的工作原理,还可以让他们检查所有内容是否已正确安装并处于正常工作状态。

您的客户需要的是类型库,这是一个描述接口的 .tlb 文件,大多数编译器都可以读取。就像 MSVC++ 中的 #import 指令,.NET 项目中的项目 + 添加引用。类型库与 .NET 程序集中的元数据完全相同。对于 C# [ComVisible] 程序集,它是从 .NET 元数据自动生成的,您在程序集上运行 Tlbexp.exe。您的客户也可以这样做,如果他们这样做,则 .tlb 之间可以保证匹配。但是,如果他们不熟悉 .NET 工具,您可以为他们代劳。

您唯一需要做的就是编写安装程序,以便在客户的机器上正确注册程序集。与 Regasm.exe 一样。强烈支持 [ComVisible] 程序集的 GAC,COM 有一个令人讨厌的 DLL Hell 问题。

【讨论】:

【参考方案2】:

您需要创建一个安装程序,在目标机器上注册您的程序集。 如果您创建一个 msi 安装程序,在文件系统编辑器中有一个 register 属性,其中包含用于 COM 注册的不同选项。 msi 可以检测项目输出的依赖关系。 你可以从这里开始阅读:

http://msdn.microsoft.com/en-us/library/cc766795.aspx

【讨论】:

我不是 C++ 专家 - 如果用户在安装程序中注册它 - 如何使用这个注册的 COM 接口,现在我可以直接链接到 .tlb 文件,并且我假设即使某些 .tlb 文件可用(或类似的文件),C++ 包装器如何知道它在哪里注册以及如何链接到它?目前我正在使用#import "\file.tlb"; @KrzysztofDziądziak 用户可以使用类型库导出器工具生成 tlb 文件。包装器将从系统注册表中获取相关数据。 msdn.microsoft.com/en-us/library/hfzzah2c(v=vs.110).aspx

以上是关于如何使用 C++ 封装的 COM 接口部署 C# 库?的主要内容,如果未能解决你的问题,请参考以下文章

java调用C#封装的DLL文件

如何使用原生 C++ 的 COM 实现 C# 的接口?

如何在c#中 封装 C++的OCX文件

使用 COM 接口 C# 从 c++ 访问会产生错误

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

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