TLBIMP.exe生成的程序集无法使用regasm.exe注册
本文关键字:exe 注册 regasm 程序集 TLBIMP | 更新日期: 2023-09-27 17:57:09
我有一个本机COM dll,我想为其构建一个C#互操作程序集。我尝试使用 tlbimp.exe 来生成 c# 程序集,然后重新加油.exe以注册程序集以通过另一个程序中的 COM 透明使用。我延迟签名,因为我仍在开发环境中,并且仍然希望进行一些调试。
TlbImp.exe 命令似乎工作正常,互操作文件已生成。
c:'>tlbimp MyNativeComDll.dll /out:MyInteropDll.dll /publickey:myPublicKey.snk /asmversion:1.6.0.0 /delaysign
TlbImp : Type library imported to C:'MyInteropDll.dll
Microsoft .NET Framework Assembly Registration Utility version 4.6.1055.0
for Microsoft .NET Framework version 4.6.1055.0
Copyright (C) Microsoft Corporation. All rights reserved.
不幸的是,是 regasm 调用导致我不知道如何修复的错误。
C:'>regasm C:'MyInteropDll.dll
RegAsm : error RA0000 : Could not load file or assembly 'MyInteropDll.dll, Version=1.6.0.0, Culture=neutral, PublicKeyToken=****************' or one of its dependencies. Strong name validation failed. (Exception from HRESULT: 0x8013141A)
我构建这一切的系统是运行Windows 7sp1的x64 Windows机器。MyNativeComDll.dll是一个x86库。所有这些都是在vcxproj post build命令中完成的,该项目是构建MyNativeComDll.dll的项目。我从命令行使用 MSBuild 来生成解决方案。我同时安装了Visual Studio 2010和Visual Studio 2015,无论我是否使用VS2010的Win64或常规开发人员命令提示符,运行regasm命令时构建失败。同样,在使用 VS2015 x64 本机工具命令提示符或 VS2015 的开发人员命令提示符时,它以大致相同的方式失败。
我用于生成包含导致问题的项目的解决方案的命令是:
C:'>msbuild MySolution.sln /p:Configuration=Release /v:n /t:Rebuild /p:Platform="Mixed Platforms"
该解决方案包含许多 x86 可视化 c++ 项目和一些作为 AnyCPU 构建的 c# 项目。生成的主应用程序应该是 32 位应用程序。所有 C# 项目都面向 .net 4.0。
为什么 regasm 会报告它无法加载文件或程序集?我查看了 DotPeak 中的 MyInteropDll.dll 文件,发现除了 mscorelib 4.0 之外,绝对没有其他依赖项。是签名问题,还是引用问题?
在浏览了@Mangist建议的帖子后,我意识到问题是注册表位置和误解 tlbimp.exe 的延迟标志的组合。这也有帮助。https://msdn.microsoft.com/en-us/library/aa302324.aspx
首先,由于我的应用程序是 x86应用程序,并且大多数库都是 x86,因此使用 x64 命令提示符是一个坏主意,因为任何影响注册表的工具都会写入 HKLM''Software 位置。由于这些是 x86 程序集,因此需要将有关它们的任何注册表项写入 HKLM''Software''Wow6432Node 位置。这个错误是由我发现的关于 tlbimp.exe 的内容触发的,因为当我使用 x86 命令行工具时,我仍然收到 regasm 错误,提示我尝试使用 x64 命令行工具构建,当然这也不起作用。
Tlbimp.exe确实可以选择延迟对程序集进行签名,并且它将这样做,但延迟对程序集进行签名不会自动注册程序集以进行跳过验证。注册程序集以进行验证跳过需要使用带有 -Vr 选项的 sn.exe 命令。这会在使用 32 位 sn.exe 时向 HKLM''软件''Wow6432Node''Microsoft''强名称''验证注册表项添加一个条目,在使用 64 位 sn.exe 时,将向 HKLM''软件''Microsoft''强名称''验证注册表项添加一个条目。
事实证明,您可以注册使用特定公钥签名的单个程序集以进行验证跳过,或者注册使用特定公钥进行验证跳过的任何程序集。将创建一个注册表项,如下所示
[HKEY_LOCAL_MACHINE'SOFTWARE'Wow6432Node'Microsoft'StrongName'Verification'*,58845dcd9090cc91]
这里 * 是通配符,十六进制数是公钥。
[HKEY_LOCAL_MACHINE'SOFTWARE'Wow6432Node'Microsoft'StrongName'Verification'MyInteropDll.dll,58845dcd9090cc91]
此条目是仅允许从签名验证中跳过 MyInteropDll.dll 程序集的示例。
然后,我的解决方案是确保在我进行 tlbimp/delaysign 调用后添加一个命令,该命令注册程序集以进行验证跳过,因为这不是自动完成的。
C:'>C:'Program Files (x86)'Microsoft SDKs'Windows'v7.0A'Bin'NETFX 4.0 Tools'sn.exe -Vr MyInteropDll.dll