为什么当加载 .NET DLL、从另一个应用程序域替换(DLL 更新为新版本),然后重新加载(使用 Assembly.LoadFrom
)版本信息仍然反射(reflect)旧版本?
assembly.GetCustomAttributes(typeof(AssemblyFileVersionAttribute), false)
或 assembly.GetCustomAttributes(typeof(AssemblyVersionAttribute), false)
也是如此。
这是正常行为吗?不过,如果我在资源管理器中检查文件,我会看到正确的版本。
有什么办法可以得到DLL的实际版本?
最佳答案
虽然不是很清楚,但“重新加载”一词是您所看到内容的有力指标。 CLR 不允许使用 Assembly.LoadFrom() 重新加载同一程序集的不同版本。这是一个强大的 DLL Hell 反制措施,可以避免许多讨厌的运行时异常。特别是说“无法将 Foo 转换为 Foo”的 InvalidCastExceptions。 .NET 中的类型标识包括程序集的 [AssemblyVersion]。调用 Assembly.LoadFrom() 只会返回对先前加载的程序集的引用。
也没有办法从 AppDomain 中卸载程序集。您唯一能做的就是创建一个新 AppDomain。
我不应该提到 Assembly.LoadFile(),它不执行此检查,那是主要的痛苦。
关于c# - FileVersionInfo.GetVersionInfo 显示替换文件的错误版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12076167/