我正在处理的产品要求注册类型库文件(后缀.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 /调用Win32函数)。 不可接受的解决方案需要作为构建过程的一部分运行 - 我不希望类型库在构建服务器上注册!
如果这很重要:.tlb
文件是从带有tlbexp.exe
的.NET程序集生成的。
答案 0 :(得分: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-Based Components: A Walkthrough。