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