You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过右键快速查看.NET程序集的目标编译版本?

解决思路:右键快速查看.NET程序集目标版本(多服务器场景)

我刚好处理过类似的批量.NET版本查询需求,给你几个轻量易部署的方案,完美适配多服务器上大量文件的场景:

方案1:注册表添加右键菜单,调用系统内置工具

这个方案完全依赖Windows自带的.NET工具,不需要额外安装软件,部署就是导入一个注册表文件。

步骤:

  1. 新建一个.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"
  1. 把这个.reg文件分发到所有服务器,双击导入注册表即可。
  2. 右键点击任意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+的目标框架信息。

步骤:

  1. 新建一个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按任意键关闭窗口"
  1. 把脚本放到服务器的某个公共目录(比如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\""
  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

火山引擎 最新活动