0

我正在开发的产品需要.tlb注册类型库文件(后缀 ),以便组件之间的内部 COM 通信正常工作。在生产机器上,此注册由 InstallShield 安装程序执行。然而,在开发人员机器上,到目前为止,我们依靠实用程序regtlibv12.exe来完成这项工作。

在将我们的开发环境升级到 Visual Studio 2017(以前的 Visual Studio 2013)时,我们发现它regtlibv12.exe不再存在。regtlib*在整个机器中快速搜索tlb*.exe和其他可能的模式并没有产生任何结果。另外,我的互联网搜索没有产生任何有用的东西——但我可能只是使用了错误的关键字......

您知道与 Visual Studio 2017 一起部署的任何实用程序可以替代regtlibv12.exe吗?可以从 PowerShell 脚本运行的任何内容都是可以接受的。同样可以接受的是相关 .NET API 的提示,我可以用它来自己编写注册过程(我什至可以尝试 p/invoke Win32 函数)。需要作为构建过程的一部分运行的解决方案是不可接受的 - 我不希望在构建服务器上注册类型库!

如果这很重要:该.tlb文件是从带有 .NET 程序集的 .NET 程序集生成的tlbexp.exe

4

1 回答 1

0

根据 Joe Willcoxson 的建议(请参阅 OP 评论),我最终将此片段添加到我们的主要可执行清单中:

<file name="foo.tlb">
    <typelib
        tlbid="{EA4C1F13-2831-37CD-A94A-C761AF367506}"
        version="1.0"
        helpdir=""/>
</file>

正如 Joe 所提到的,为此,类型库文件必须与包含清单的可执行文件位于同一文件夹中。

具体到我的情况,我很“幸运”,因为我们的主可执行文件是作为进程外 COM 服务器的,所以当客户端创建 COM 对象时,我们的主可执行文件作为单独的进程启动并且我们的清单生效。如果我们的 COM 对象位于进程内 COM 服务器中,那么客户端可执行文件的清单就会生效,我必须将清单片段添加到客户端可执行文件中。

最后,我想补充一点,这个解决方案可能不是一般有用的。其他人可以从这里得到的是,Windows 注册表中的 COM 注册可以通过一种称为“隔离 COM”的技术来避免,该技术也称为“免注册 COM”。您是否可以利用免注册 COM 在很大程度上取决于您的 COM 服务器和 COM 客户端的部署方式,以及您是否可以控制 COM 服务器和客户端使用的清单。

与 COM 一样,它不是一个简单的主题,但作为您研究的起点,我可以推荐 2005 MSDN 文章Registration-Free Activation of COM Components: A Walkthrough及其 .NET 伴侣Registration-Free Activation of .NET-基于组件:演练

于 2018-02-23T17:50:00.017 回答