【问题标题】:Assembly Version numbers, signed assemblies Why do I get a FileLoadExceptions程序集版本号、签名程序集 为什么我会收到 FileLoadExceptions
【发布时间】:2011-10-14 20:03:57
【问题描述】:

我的问题:

我有一个签名的程序集 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…

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

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

【问题讨论】:

  • 请添加您的代码,否则我不知道,因为此错误可能来自您代码中的任何内容。
  • 我最初没有输入任何代码,因为这不是真正的编码问题。我需要做的就是从签名的程序集中实例化一个类的实例,然后它将通过异常。即Class2 c = new Class2();

标签: .net versioning .net-assembly fileloadexception


【解决方案1】:

当一个程序集被强命名时,任何引用它的东西都会寻找那个特定的版本。

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

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

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

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

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

【讨论】:

  • 你说得对,“特定版本”是编译时属性。我的错。
【解决方案2】:

程序集 A 是否签名并不一定重要。您是否在项目 B 对 A 的程序集引用上使用“特定版本 = true”进行编译?如果是这样,那么 CLR 将使用严格的规则来确定给定版本的 A 是否可以接受。如果不是,那么 CLR 将使用不太严格的规则,并且如果 A 增加其版本,您将不需要重新编译。

根据您的环境,您可能不会担心 A 在未来版本中会破坏兼容性。如果您不关心,那么您应该将程序集引用更改为“特定版本 = false”。 (在工作中,我们有两种情况:例如,当我们依赖 3rd 方控件时,我们通常强制“特定版本 = true”,但是当我们使用内部共享组件时,我们将针对使用它的应用程序,我们将确保 'Specific Version = false' 所以我们不需要重新编译。)

您可以在 MSDN 上找到更多信息,包括当您确实必须针对特定版本进行编译但希望稍后重定向绑定时如何通过配置文件规避此问题,请访问 MSDN:Redirecting Assembly Versions

希望有帮助!

【讨论】:

  • 程序集引用的“特定版本”属性仅用于编译时版本检查。它不在运行时使用。因此,即使我将其设置为 false,它对运行时也没有影响。同样的错误仍然发生。
  • 是的,我肯定错了。这里有一个关于这个主题的好帖子:social.msdn.microsoft.com/Forums/en-US/csharpide/thread/…
猜你喜欢
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 2013-08-04
相关资源
最近更新 更多