程序集绑定和重定向

时间:2012-04-16 14:25:17

标签: c# dll redirect assemblies

我有一个引用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应该只是这样工作。

有谁知道问题是什么以及如何解决? 感谢

1 个答案:

答案 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中。