我有一个引用DLL的EXE - 在本例中我称之为 TestDLL.dll 。
EXE是用C#编写的,DLL是用VB .Net编写的。
我创建了DLL的演示程序集版本 - 例如 - TestDLL.dll版本1.0.0.0 我想编译EXE并引用演示版DLL(1.0.0.0)。之后 - 我希望EXE使用相同的DLL,但我将放入任何版本的GAC中。 为此,我将DLL引用的 “复制本地” 属性设置为 FALSE 。< / p>
我的目标是 - 例如 - 在编译之后,我将使用程序集版本2.1.6.0放入GAC TestDLL.dll,并且EXE将使用程序集重定向绑定找到它。为此,我使用了配置文件。我用这个链接来创建它:
http://msdn.microsoft.com/en-us/library/7wd6ex19(v=vs.71).aspx
所以我的配置文件看起来像这样:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="myAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="en-us" />
<!-- Assembly versions can be redirected in application, publisher policy, or machine configuration files. -->
<bindingRedirect oldVersion="1.0.0.0"
newVersion="2.1.6.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
问题是,在完成所有这些之后,我运行EXE并且在访问dll时,我得到了一个着名的错误: System.IO.FileNotFoundException:无法加载文件或程序集“TestDLL,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 9d8162944bd6fdc7”或其依赖项之一。该系统找不到指定的文件。 文件名:'TestDLL,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 9d8162944bd6fdc7'
意思是,EXE找不到我引用的原始DLL 。 我知道我可以“引用”GAC或使用反射,但我不想 - 因为这个EXE应该只是这样工作。
有谁知道问题是什么以及如何解决? 感谢
答案 0 :(得分:12)
确保您已设置正确的publicKeyToken
。在您显示的代码中,您使用的是publicKeyToken="32ab4ba45e0a69a1"
,它是来自MSDN链接的公钥令牌。这显然是不您的程序集的公钥标记。为此,您需要使用相同的密钥对两个程序集(1.0.0.0和2.1.6.0)进行签名。要提取公钥令牌,您可以使用sn.exe工具或查看您获得的异常堆栈跟踪(它告诉您publicKeyToken="9d8162944bd6fdc7"
):
sn.exe -Tp myassembly.dll
但是如果编译可执行文件的程序集没有用相同的密钥签名,那么这将不起作用。
我也看到你设置了culture="en-us"
,但你的装配是否使用了这种文化?您也可以尝试culture="Neutral"
。
最后确保已将适当版本的程序集部署到GAC中。