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

标签 c# appdomain system.reflection

为什么当加载 .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/

相关文章:

c# - 如何在 ASP.NET MVC 中使用分部 View 模型

c# - 为什么 SqlDataReader to DataTable 只有在我使用单独的字段时才有效?

c# - 在 C# 中创建 "trusted"xml 文件

silverlight - Silverlight 是否为每个浏览器选项卡使用单独的应用程序域?

c# - 从另一个 AppDomain 接收程序集引用时出现异常

node.js - 托管多个 Node JS 应用程序的 digital ocean ubuntu 14.04

c# - 如何在 .NET 3.5 中获取 CSIDL_COMMON_DOCUMENTS 的路径?

c# - 获取一个类在 C# 中继承和实现的所有类型和接口(interface)

.net - 在通过反射加载的 .NET Framework 4.7.1 库上执行方法时,System.Net.Http MethodNotFoundException

c# - 快速访问在 C# 中包含属性的类型/方法/...