gpt4 book ai didi

.net - 程序集版本号、签名程序集 为什么我会收到 FileLoadExceptions

转载 作者:行者123 更新时间:2023-12-04 06:11:00 25 4
gpt4 key购买 nike

我的问题:

我有一个签名的程序集 A.dll,它的版本为 1.0.0.0
我有另一个引用 A.dll 的程序集(比如说 B.dll)。

一旦两个程序集都加载正常,没有任何问题。
现在如果 A.dll 的版本更改为 1.0.0.1 并重新编译 B.dll 是否必须重新编译?

我问是因为我有这个确切的场景,在 A.dll 更改了版本之后,我现在收到以下尝试加载 B.dll 的异常:

Unhandled Exception: System.IO.FileLoadException: 
Could not load file or assembly A, Version=1.0.0.0,
Culture=neutral, PublicKeyToken…

这让我觉得这个问题的答案永远是肯定的。但是,我还有另一个示例,其中我有两个具有上述确切场景的程序集,并且加载程序集没有任何问题。

什么场景/条件会导致此异常?如果有人能对此提供一些见解,将不胜感激。
谢谢。

最佳答案

当程序集被强命名时,任何引用它的东西都将查找该特定版本。

您是正确的,Visual Studio 中的“特定版本”不会以任何方式影响运行时。实际上,“特定版本”基本上意味着“当您运行构建时,如果 MSBUILD 找不到引用的版本,构建是否会失败,或者只是使用可以在文件系统上找到的下一个版本?”

如果您重新编译 A 并将其部署为部分更新(而不是完全推出应用程序),那么如果应用程序中有任何引用旧版本的内容,您的应用程序可能会崩溃,除非您仍然拥有旧版本的A 也可用(即您没有覆盖它)。

这是某些产品使用 GAC 的主要原因,因为它可以保存同一 DLL 的多个版本而不会相互覆盖 - 如果您尝试将同一文件的不同版本部署到 bin 文件夹中(假设它们具有相同的文件名) ,它们通常会这样做),它们会相互覆盖,并且您的产品中只会得到 1 个 DLL!

您可以做的另一个技巧是将“重新版本控制”的 DLL 放在二进制目录下的子文件夹中,然后编辑 app.config 以告诉运行时在何处找到它们。
http://support.microsoft.com/kb/837908

因此,总而言之,强命名程序集不仅仅使用简单的名称来确定程序集的身份 - 更改其版本可以被认为是完全更改其名称。

关于.net - 程序集版本号、签名程序集 为什么我会收到 FileLoadExceptions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7772957/

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