我可以在第三方dll中更改dll引用吗?
本文关键字:dll 引用 第三方 我可以 | 更新日期: 2023-09-27 18:04:27
我有两个第三方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:签名一个未签名的程序集(没有延迟签名),我设法用我的*.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的*.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
}
。新增生成的公钥令牌。
然后用
重新组装dllilasm /dll /key=Foo.snk Bar.il
效果很好