如何从应用程序中检测运行/执行的.NET Framework版本?

6
为了能够调查我应用程序中报告的问题,我需要知道应用程序在用户端运行的(运行时)环境。除了应用程序版本和操作系统版本外,我还想向用户显示.NET CLR版本和(如果可能的话).NET Framework版本,以便用户可以将这些信息反馈给我。
我找到了几个检测已安装.NET Framework的解决方案,但这不是我需要的。
我起初不关心用户计算机上安装了什么其他软件。实际上没有用于运行我的应用程序的.NET Framework安装定义为其他软件,而不是相关软件。
为了满足CLR版本要求,我发现Environment.Version.ToString()很有用。
然而,阅读文档让我感到焦虑。Environment.Version文档的备注部分指出:

对于.NET Framework 4.5及更高版本,我们不建议使用Version属性来检测运行时版本[...]

我理解CLR类似于API,Framework类似于可以更新的组件和实际逻辑。因此,知道CLR版本是一个好的开始,但Framework版本也可能是必需的,因为它可以指出由于实际Framework(逻辑)中的错误而导致的不兼容性。我的应用程序中的错误可能是Framework中的bug造成的,因此我的应用程序中没有bug(但可能有解决方法潜力)。这可以大大加快调试过程。
考虑到关于Environment.Version的备注,我可以安全地使用什么来获取在.NET Framework 4.0到.NET Framework 4.7.2上运行的应用程序的CLR版本?
有没有办法检测正在运行我的应用程序的.NET Framework版本(组件和逻辑)?也许可以通过反射加载的程序集并从特定程序集中获取程序集版本来实现,但这种方法可靠吗?

.NET 4.0+总是使用CLR 4,因为它是先前版本的就地升级。https://learn.microsoft.com/en-us/dotnet/standard/clr#clr-versions - kapsiR
@kapsiR:谢谢,所以结果是要加载(在已加载的程序集中查找)mscorlib.dll并获取AssemblyFileVersionAttribute,对吗? - burnersk
不,我会像你之前提到的那样查询注册表以获取已安装版本的信息:https://learn.microsoft.com/en-us/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed?view=netframework-4.7.2#find-newer-net-framework-versions-45-and-later - kapsiR
@kapsiR:请问是否确保只使用最新安装的.NET Framework版本来运行应用程序?或者使用应用程序清单中指定的.NET Framework版本(如果找不到,则使用最新安装的版本)?我找不到有关实际使用哪个版本的信息。 - burnersk
1
@burnersk,将不会有任何.NET 5.0版本。下一个版本是.NET Core,它是完全不同的运行时和编译目标。 - Panagiotis Kanavos
显示剩余3条评论
1个回答

1
基于文件版本的评论,您可以像这样做:
var strType = typeof(System.String);
var assemblyUri = strType.Assembly.CodeBase;
var versionInfo = FileVersionInfo.GetVersionInfo(new Uri(assemblyUri).LocalPath);

这将为包含当前运行时的 System.String 类型的程序集提供 FileVersionInfo,这对我来说似乎是相当明确的。


1
为什么要通过GetAssembly间接获取程序集,而不直接使用手头类型的Assembly属性呢? - Damien_The_Unbeliever
因为我还没有喝早晨的咖啡,忘记了那个属性!我会编辑答案... - MarcE
1
不要使用此方法,因为它会给出不一致的结果(例如可以检测到安装了 .Net Framework 4.7.2,而实际上只安装了 4.6)。请参见 https://stackoverflow.com/a/51472697/8861729。 - Indigo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接