FileVersionInfo.GetVersionInfo显示替换文件的错误版本

时间:2012-08-22 15:10:00

标签: c# appdomain system.reflection

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

assembly.GetCustomAttributes(typeof(AssemblyFileVersionAttribute), false)assembly.GetCustomAttributes(typeof(AssemblyVersionAttribute), false)也是如此。

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

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

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

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