我可以在第三方dll中更改一个dll引用吗?

3

我有两个第三方dll文件,都没有强名称。我想在app.config中引用这些dll文件,以便能够在网络上找到它们,并避免为每个使用它们的应用程序复制多个副本......据我所知,要通过assemblyBindingapp.config文件中引用它们,它们必须具备强名称:

<runtime>
  <dependentAssembly>
    <assemblyIdentity name="External"  culture="neutral" publicKeyToken="xxxx"/>
    <codeBase version="1.0.0.0" href="FILE://N://Lib/External.dll"/>
  </dependentAssembly>
...

所以我需要对它们进行签名。感谢.NET-fu:无需延迟签名即可对未签名程序集进行签名,我使用我的*.snk文件对其进行了签名:

ildasm /all /out=Bar.il Bar.dll
ilasm /dll /key=Foo.snk Bar.il

然后,我将解决方案中的引用替换为已签名的引用,并将CopyLocaly设置为false。然后,我用新的publicKeyToken编辑了app.config文件。
但是,当运行我的应用程序时,我仍然会收到FileLoadException,说加载程序无法找到其中一个带有publicKeyToken=null的dll。
因此,我决定这些dll之一引用了另一个dll,而该引用明确不知道另一个dll的已签名版本。
问题来了:是否有一种方法可以更改第一个dll内部对第二个dll的引用为已签名版本?或者我的唯一选择是不使用app.config来加载这些dll,并在代码中手动加载它们,例如使用Assembly.LoadFrom
1个回答

4
最后看起来很容易了。在包含对第二个dll的引用的dll的*.il文件中,我找到了以下名为第二个dll的条目:
.assembly extern /*23000002*/ SecondDllName
{
  .ver 1:0:0:0
}

然后我将其改为

.assembly extern /*23000002*/ SecondDllName
{
  .publickeytoken = (xx xx xx xx xx xx xx xx )  
  .ver 1:0:0:0
}

即添加所生成的公钥标记。

然后,我使用以下命令重新组合了dll:

ilasm /dll /key=Foo.snk Bar.il

它起作用了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接