如何编辑DLL或EXE文件中嵌入的清单的“公钥或令牌”字段?

时间:2010-08-23 11:23:43

标签: .net manifest dll

我正在尝试解决以下问题: [.Net 2.0,CLR 2.5.something,64位机器,所有DLL和EXE根据corflags显示为“任何CPU”编译]

我维护一个使用第三方DLL的遗留应用程序。 突然之间(据我所知),依赖于DLL的功能在其部署的其中一台机器上停止工作,出现以下错误:

无法加载文件或程序集'Interop.Merge70,Version = 7.0.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一。定位的程序集的清单定义与程序集引用不匹配。

我在应用程序的exe文件中查看了DLL的清单以及AssemblyRef(使用了ildasm工具),我发现的唯一区别是DLL是强签名的(?)但是根据AssemblyRef DLL是无符号的。现在,撇开这样一个事实:如果这是问题 - 直到现在这样做了吗? (因为我只有用户的话;-))

如何编辑应用程序的清单以更改要使用DLL的清单中显示的公钥进行签名的AssemblyRef? (另外,由于我没有得到遗留版本的代码,我理想地寻找exe编辑解决方案以及针对当前版本的应用程序的VS2008)

更新结果表明在当前版本中 - 我使用第三方代码中的“密钥或令牌”字段的代码,包含提取的正确令牌通过“sn -Tp 3rdparty.dll”..但运行时会抛出相同的错误... 我在这里缺少什么?

3 个答案:

答案 0 :(得分:0)

您必须重新编译库并在编译期间对其进行签名或使用延迟签名(但我从未使用过它)。

从它的外观来看,这是一个TLBEXP生成的库,除了签署代码的选项之外。

如果您没有原始密钥,则必须重新签署所有程序集。

答案 1 :(得分:0)

如果您还没有获得源代码,那么您可以使用ILDASM,然后执行ILASM:在ILASM步骤中,提供所需的私钥。

但是,假设您拥有与要为二进制文件提供的公钥令牌对应的私钥。如果缺少这个(我猜它是,如果源代码已经消失)那么你需要选择另一个私钥来签名。

如果您更改了私钥,那么您还需要重新编译引用该程序集的任何代码,因为通过更改私钥,您将更改公钥令牌(最终会出现原始错误)。

编辑:“我在这里缺少什么?” - 你确定在运行时使用了正确的二进制文件吗?如果您通过fuslogvw.exe打开日志记录,则应该获得更详细的例外。

答案 2 :(得分:0)

以下解决了这个问题:

在当前版本中,我按照供应商的推荐添加了DLL - 它是Com +库而不是独立的DLL。这使当前版本起作用。 然后,我将第三方DLL作为构建的一部分进行复制,并将其放置在旧版本中而不是DLL中。问题解决了.... 感谢所有 提供了有用的答案,并提供了有用的工具。我确实学到了一些关于故障排除的知识:)