大会结合和重定向(Assembly binding and redirect)

2019-07-29 00:05发布

我有一个引用的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。

我的目标是 - 例如编译后,我把在GAC TestDLL.dll与程序集版本2.1.6.0,和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,版本= 1.0.0.0,文化=中立,公钥= 9d8162944bd6fdc7'或它的一个依赖。 该系统找不到指定的文件。 文件名: 'TestDLL,版本= 1.0.0.0,文化=中性公钥= 9d8162944bd6fdc7'

这意味着,该EXE无法找到原来DLL我参考。 我知道我可以只是“参考”的GAC或使用反射,但我不希望 - 因为该EXE应该只工作这条路。

有谁知道是什么问题,如何解决?
谢谢

Answer 1:

请确保您已设置适当的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。



文章来源: Assembly binding and redirect