gpt4 book ai didi

c# - 程序集绑定(bind)和重定向

转载 作者:太空狗 更新时间:2023-10-29 20:05:39 25 4
gpt4 key购买 nike

我有一个引用 DLL 的 EXE - 对于这个例子,我将其称为 TestDLL.dll
EXE是用C#写的,DLL是用VB.Net写的。

我创建了 DLL 的演示程序集版本 - 例如 - TestDLL.dll 版本 1.0.0.0。
我想用对演示版本 DLL (1.0.0.0) 的引用来编译 EXE。之后 - 我希望 EXE 使用相同的 DLL,但我将放入 GAC 的任何版本。
为此,我将 DLL 引用的“复制本地” 属性设置为FALSE

例如,我的目标是 - 编译后,我将放入程序集版本为 2.1.6.0 的 GAC TestDLL.dll,EXE 将使用程序集重定向绑定(bind)找到它。为此,我使用了一个配置文件。我使用此链接创建它:
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 应该只能以这种方式工作。

有谁知道问题出在哪里以及如何解决?
谢谢

最佳答案

确保您设置了正确的publicKeyToken。在您显示的代码中,您正在使用 publicKeyToken="32ab4ba45e0a69a1" 这是来自 MSDN 链接的公钥 token 。这显然不是您程序集的公钥标记。为此,您需要使用相同的 key 对两个程序集(1.0.0.0 和 2.1.6.0)进行签名。要提取公钥 token ,您可以使用 sn.exe工具或查看您获得的异常堆栈跟踪(它告诉您 publicKeyToken="9d8162944bd6fdc7"):

sn.exe -Tp myassembly.dll

但是如果编译可执行文件所针对的程序集没有使用相同的 key 签名,这将无法工作。

我还看到您设置了 culture="en-us" 但是您的程序集是否使用这种文化?您也可以尝试 culture="Neutral"

最后确保您已将正确版本的程序集部署到 GAC 中。

关于c# - 程序集绑定(bind)和重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10176001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com