Visual Studio 2017中regtlibv12.exe的替代方案咨询
解决VS2017下替代regtlibv12.exe注册类型库的方案
刚好之前升级到VS2017时也碰到过regtlibv12.exe凭空消失的问题,折腾了一番后找到了几个符合你需求的解决方案,分享给你:
一、用VS2017自带的regasm.exe直接替代
VS2017把regtlibv12.exe移除了,但自带的regasm.exe完全能承担它的注册类型库功能,而且完美支持PowerShell脚本调用。
先找到regasm的位置:它藏在VS安装目录的.NET Framework子文件夹里,比如我用的VS2017 Professional版本,路径是:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Framework\v4.0.30319\regasm.exe要是记不清具体路径,直接在PowerShell里搜:
Get-ChildItem -Path "C:\Program Files (x86)\Microsoft Visual Studio\2017" -Name "regasm.exe" -Recurse注册命令很简单:对着你已有的
.tlb文件,用管理员权限运行PowerShell,执行:& "你找到的regasm.exe路径" /register /tlb:"你的tlb文件绝对路径"要卸载的话,把
/register换成/unregister就行。
二、自己写注册逻辑(API方案)
如果需要更灵活的控制,比如集成到自定义工具或者脚本里,也可以通过Win32 P/Invoke或者.NET API来实现:
1. Win32 P/Invoke调用RegisterTypeLib
直接调用系统API是最底层也最可靠的方式,下面是C#的示例代码,你可以编译成控制台程序,或者在PowerShell里调用(比如用Add-Type加载这段代码):
using System; using System.Runtime.InteropServices; class TlbRegistrar { [DllImport("oleaut32.dll", CharSet = CharSet.Unicode)] private static extern int RegisterTypeLib( ITypeLib ptlib, string szFullPath, string szHelpDir); [DllImport("oleaut32.dll", CharSet = CharSet.Unicode)] private static extern int LoadTypeLibEx( string szFile, RegKind regKind, out ITypeLib pptlib); private enum RegKind { RegKind_Default = 0, RegKind_Register = 1, RegKind_None = 2 } static void Main(string[] args) { if (args.Length != 1) { Console.WriteLine("用法: TlbRegistrar.exe <tlb文件路径>"); return; } string tlbPath = args[0]; ITypeLib typeLib; int result = LoadTypeLibEx(tlbPath, RegKind.RegKind_None, out typeLib); if (result != 0) { Console.WriteLine($"加载类型库失败,错误码: {result}"); return; } result = RegisterTypeLib(typeLib, tlbPath, null); if (result == 0) { Console.WriteLine("类型库注册成功!"); } else { Console.WriteLine($"注册类型库失败,错误码: {result}"); } } }
2. .NET TypeLibConverter(可选)
因为你的tlb是用tlbexp.exe从.NET程序集生成的,也可以用System.Runtime.InteropServices.TypeLibConverter来生成并注册,但既然你已经有现成的tlb,这个方案就不如上面的P/Invoke直接了,不过如果以后需要从程序集直接处理的话可以参考。
几个关键点要注意
- 不管用哪种方式,必须以管理员权限运行,不然注册表写入会失败,这个坑我踩过好几次。
- 这些方案都是针对开发环境的手动/脚本触发操作,完全符合你“不在构建服务器上注册”的要求。
内容的提问来源于stack exchange,提问作者herzbube
相关产品推荐
相关产品推荐

