我有两个第三方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
?
答案 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
}
即。添加了生成的公钥令牌。
然后我用
重新组装了dllilasm /dll /key=Foo.snk Bar.il
它有效。