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

本文关键字:dll 引用 第三方 我可以 | 更新日期: 2023-09-27 18:04:27

我有两个第三方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的signed版本。

问题来了:有没有办法把第一个dll中的引用改为第二个dll的签名版本?或者我唯一的选择是不为这些dll使用app.config,而是在代码中手动加载它们,例如使用Assembly.LoadFrom ?

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

最后看起来很容易。在包含对第二个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

效果很好