regtlibv12.exe 2017 年 Visual Studio 更换
regtlibv12.exe replacement in Visual Studio 2017
我正在开发的产品需要注册一个类型库文件(后缀 .tlb
),组件之间的内部 COM 通信才能正常工作。在生产机器上,此注册由 InstallShield 安装程序执行。然而,在开发人员机器上,我们目前依赖实用程序 regtlibv12.exe
来完成这项工作。
在将我们的开发环境升级到 Visual Studio 2017(之前是 Visual Studio 2013)时,我们发现 regtlibv12.exe
不再存在。在整个机器中快速搜索 regtlib*
、tlb*.exe
和其他可能的模式没有产生任何结果。另外,我的 Internet search-fu 没有产生任何有用的结果 - 但我可能只是使用了错误的关键字...
您是否知道使用 Visual Studio 2017 部署的任何实用程序可以替代 regtlibv12.exe
? PowerShell 脚本中可以是 运行 的任何内容都是可以接受的。还可以接受的是相关 .NET API 的提示,我可以用它来自己编写注册过程的代码(我什至可能会尝试 p/invoke Win32 函数)。 不 可接受的解决方案需要 运行 作为构建过程的一部分 - 我不想在构建服务器上注册类型库!
万一这很重要:.tlb
文件是从具有 tlbexp.exe
.
的 .NET 程序集生成的
根据 Joe Willcoxson 的建议(参见 OP 评论),我最终将此代码段添加到我们的主要可执行清单中:
<file name="foo.tlb">
<typelib
tlbid="{EA4C1F13-2831-37CD-A94A-C761AF367506}"
version="1.0"
helpdir=""/>
</file>
正如 Joe 所提到的,要使其正常工作,类型库文件必须位于与包含清单的可执行文件相同的文件夹中。
具体到我的情况,我是 "lucky" 因为我们的主要可执行文件是一个 out-of-process COM 服务器,所以当客户端创建一个 COM 对象时,我们的主要可执行文件作为一个单独的进程启动并且我们的清单生效。如果我们的 COM 对象在 in-process COM 服务器中,客户端可执行文件的清单就会生效,我将不得不将清单片段添加到客户端可执行文件中。
最后,我想补充一点,这个解决方案可能不是一般有用。其他人可以从这里得到的是 Windows 注册表中的 COM 注册可以通过称为 "Isolated COM" 的技术避免,也称为 "Registration-Free COM"。您是否可以利用 Registration-Free COM 在很大程度上取决于您的 COM 服务器和 COM 客户端的部署方式,以及您是否可以控制 COM 服务器和客户端使用的清单。
与 COM 一样,这不是一个简单的主题,但作为您研究的起点,我可以推荐 2005 MSDN 文章 Registration-Free Activation of COM Components: A Walkthrough, and its .NET companion Registration-Free Activation of .NET-Based Components: A Walkthrough。
我正在开发的产品需要注册一个类型库文件(后缀 .tlb
),组件之间的内部 COM 通信才能正常工作。在生产机器上,此注册由 InstallShield 安装程序执行。然而,在开发人员机器上,我们目前依赖实用程序 regtlibv12.exe
来完成这项工作。
在将我们的开发环境升级到 Visual Studio 2017(之前是 Visual Studio 2013)时,我们发现 regtlibv12.exe
不再存在。在整个机器中快速搜索 regtlib*
、tlb*.exe
和其他可能的模式没有产生任何结果。另外,我的 Internet search-fu 没有产生任何有用的结果 - 但我可能只是使用了错误的关键字...
您是否知道使用 Visual Studio 2017 部署的任何实用程序可以替代 regtlibv12.exe
? PowerShell 脚本中可以是 运行 的任何内容都是可以接受的。还可以接受的是相关 .NET API 的提示,我可以用它来自己编写注册过程的代码(我什至可能会尝试 p/invoke Win32 函数)。 不 可接受的解决方案需要 运行 作为构建过程的一部分 - 我不想在构建服务器上注册类型库!
万一这很重要:.tlb
文件是从具有 tlbexp.exe
.
根据 Joe Willcoxson 的建议(参见 OP 评论),我最终将此代码段添加到我们的主要可执行清单中:
<file name="foo.tlb">
<typelib
tlbid="{EA4C1F13-2831-37CD-A94A-C761AF367506}"
version="1.0"
helpdir=""/>
</file>
正如 Joe 所提到的,要使其正常工作,类型库文件必须位于与包含清单的可执行文件相同的文件夹中。
具体到我的情况,我是 "lucky" 因为我们的主要可执行文件是一个 out-of-process COM 服务器,所以当客户端创建一个 COM 对象时,我们的主要可执行文件作为一个单独的进程启动并且我们的清单生效。如果我们的 COM 对象在 in-process COM 服务器中,客户端可执行文件的清单就会生效,我将不得不将清单片段添加到客户端可执行文件中。
最后,我想补充一点,这个解决方案可能不是一般有用。其他人可以从这里得到的是 Windows 注册表中的 COM 注册可以通过称为 "Isolated COM" 的技术避免,也称为 "Registration-Free COM"。您是否可以利用 Registration-Free COM 在很大程度上取决于您的 COM 服务器和 COM 客户端的部署方式,以及您是否可以控制 COM 服务器和客户端使用的清单。
与 COM 一样,这不是一个简单的主题,但作为您研究的起点,我可以推荐 2005 MSDN 文章 Registration-Free Activation of COM Components: A Walkthrough, and its .NET companion Registration-Free Activation of .NET-Based Components: A Walkthrough。