1

为什么在加载 .NET DLL 时,从另一个应用程序域替换(DLL 更新为新版本),然后重新加载(使用Assembly.LoadFrom)版本信息仍然反映旧版本?

assembly.GetCustomAttributes(typeof(AssemblyFileVersionAttribute), false)or观察到同样的情况assembly.GetCustomAttributes(typeof(AssemblyVersionAttribute), false)

这是正常行为吗?如果我在资源管理器中检查文件,我会看到正确的版本。

有没有办法获得DLL的实际版本?

4

2 回答 2

4

当您将程序集加载到 AppDomain 中时,您无法卸载它。因此,替换文件并在已经加载程序集的 AppDomain 中重新加载它根本不起作用(这是设计使然)。您需要一个新的 AppDomain 来加载替换的程序集。

于 2012-08-22T15:40:55.257 回答
3

这不是很清楚,但“重新加载”这个词是你所看到的一个强有力的指标。CLR 不允许使用 Assembly.LoadFrom() 重新加载同一程序集的不同版本。这是一个强大的 DLL Hell 反制措施,可以避免很多讨厌的运行时异常。特别是说“不能将 Foo 转换为 Foo”的 InvalidCastExceptions。.NET 中的类型标识包括程序集的 [AssemblyVersion]。调用 Assembly.LoadFrom() 只会返回对先前加载的程序集的引用。

也没有办法从 AppDomain 中卸载程序集。您唯一能做的就是创建一个的AppDomain。

我不应该提到 Assembly.LoadFile(),它不执行此检查,这是主要的痛苦。

于 2012-08-22T15:48:15.420 回答