如何通过右键快速查看.NET程序集的目标编译版本?
解决思路:右键快速查看.NET程序集目标版本(多服务器场景)
我刚好处理过类似的批量.NET版本查询需求,给你几个轻量易部署的方案,完美适配多服务器上大量文件的场景:
方案1:注册表添加右键菜单,调用系统内置工具
这个方案完全依赖Windows自带的.NET工具,不需要额外安装软件,部署就是导入一个注册表文件。
步骤:
- 新建一个
.reg文件,写入以下内容(根据你服务器上的.NET版本调整CorFlags.exe路径,64位系统可以同时添加Framework和Framework64的版本):
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\查看.NET版本] @="查看.NET目标版本" [HKEY_CLASSES_ROOT\*\shell\查看.NET版本\command] @="\"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\CorFlags.exe\" \"%1\" && pause"
- 把这个
.reg文件分发到所有服务器,双击导入注册表即可。 - 右键点击任意DLL/EXE文件,选择「查看.NET版本」,就会弹出命令行窗口,显示该程序集的CLR版本、目标平台等信息。
提示:如果是.NET Core/.NET 5+的程序集,CorFlags可能显示CLR版本为
v4.0.30319,这时候可以结合dumpbin.exe(VS Build Tools自带,若服务器没装VS,可以复制该文件到服务器),把命令改成:@="\"C:\\Path\\To\\dumpbin.exe\" /headers \"%1\" | findstr \"Framework\" && pause"
方案2:PowerShell脚本+右键菜单(更精准支持.NET Core)
PowerShell在所有Windows服务器上默认自带,脚本可以更灵活地解析.NET Core/.NET 5+的目标框架信息。
步骤:
- 新建一个
Get-DotNetVersion.ps1脚本,内容如下:
param($FilePath) try { # 以反射方式加载程序集,不执行代码 $assembly = [System.Reflection.Assembly]::ReflectionOnlyLoadFrom($FilePath) # 优先获取TargetFrameworkAttribute(.NET Core/.NET 5+和新版.NET Framework都支持) $targetFrameworkAttr = $assembly.GetCustomAttributesData() | Where-Object { $_.AttributeType.Name -eq 'TargetFrameworkAttribute' } if ($targetFrameworkAttr) { $targetVersion = $targetFrameworkAttr.ConstructorArguments[0].Value Write-Host "✅ 目标.NET框架版本: $targetVersion" -ForegroundColor Green } else { # 回退到CLR运行时版本 $runtimeVersion = $assembly.ImageRuntimeVersion Write-Host "ℹ️ CLR运行时版本: $runtimeVersion" -ForegroundColor Cyan } } catch { Write-Host "❌ 这不是有效的.NET程序集" -ForegroundColor Red } Read-Host "`n按任意键关闭窗口"
- 把脚本放到服务器的某个公共目录(比如
C:\Tools\),然后创建注册表文件导入:
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\查看.NET版本] @="查看.NET目标版本" [HKEY_CLASSES_ROOT\*\shell\查看.NET版本\command] @="powershell.exe -ExecutionPolicy Bypass -File \"C:\\Tools\\Get-DotNetVersion.ps1\" \"%1\""
- 同样,分发注册表文件到所有服务器导入即可,右键就能调用。
方案3:批量扫描控制台程序(适合大量文件批量排查)
如果需要一次性扫描整个目录下的所有.NET程序集,写一个轻量的C#控制台程序是最高效的,编译后是单个EXE,不需要安装任何依赖。
示例代码:
using System; using System.IO; using System.Linq; using System.Reflection; namespace DotNetVersionScanner { class Program { static void Main(string[] args) { if (args.Length == 0) { Console.WriteLine("请指定要扫描的目录路径,例如:DotNetVersionScanner.exe C:\\Apps"); Console.ReadKey(); return; } string targetDir = args[0]; if (!Directory.Exists(targetDir)) { Console.WriteLine("指定的目录不存在!"); Console.ReadKey(); return; } Console.WriteLine($"正在扫描目录: {targetDir}\n"); // 遍历所有DLL和EXE foreach (var file in Directory.GetFiles(targetDir, "*.*", SearchOption.AllDirectories) .Where(f => f.EndsWith(".dll") || f.EndsWith(".exe"))) { try { var assembly = Assembly.ReflectionOnlyLoadFrom(file); var targetFrameworkAttr = assembly.GetCustomAttributesData() .FirstOrDefault(a => a.AttributeType.Name == "TargetFrameworkAttribute"); string versionInfo = targetFrameworkAttr != null ? targetFrameworkAttr.ConstructorArguments[0].Value.ToString() : assembly.ImageRuntimeVersion; Console.WriteLine($"✅ {Path.GetFileName(file)}: {versionInfo}"); } catch { // 跳过非.NET程序集 continue; } } Console.WriteLine("\n扫描完成!"); Console.ReadKey(); } } }
编译后把EXE文件分发到服务器,运行时输入目标目录即可批量输出所有.NET文件的版本信息,还可以把结果重定向到文本文件:DotNetVersionScanner.exe C:\\Apps > VersionReport.txt
内容的提问来源于stack exchange,提问作者Karlsbergs




