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

时间:2014-05-22 00:35:58

标签: c# visual-studio-2010 visual-studio dll

我有两个第三方dll,两者都没有强烈的名字。我想在app.config中引用这些dll,以便能够在网络上找到它们,并避免使用它们为每个应用程序复制多次...据我所知,通过assemblyBinding引用它们在app.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: Signing an Unsigned Assembly (Without Delay Signing)我设法使用*.snk文件签名:

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

然后我将解决方案中的引用替换为已签名的引用,并将CopyLocaly设置为false。之后,我使用新的app.config编辑了publicKeyToken文件。

然而,在运行我的应用程序时,我仍然得到FileLoadException,说加载程序找不到publicKeyToken=null这些dll中的一个。

所以我决定这些dll引用另一个,并且该引用definetely对其他dll的签名版本一无所知。

问题在于:有没有办法将第一个dll中的引用更改为第二个dll的签名版本?或者我唯一的选择就是不要对这些dll使用app.config并在代码中手动加载它们,比如Assembly.LoadFrom

1 个答案:

答案 0 :(得分:2)

最终似乎很容易。在包含对第二个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

它有效。