【问题标题】:How to determine if assembly has been ngen'd?如何确定组装是否已被ngen'd?
【发布时间】:2026-01-26 22:20:05
【问题描述】:

如何确定特定的 .Net 程序集是否已经被生成?我需要从代码中检查。即使调用命令行也可以。目前我看不到任何确定这一点的方法。

【问题讨论】:

  • 在代码中?从命令行?交互式?什么?它必须在某处的文件属性中......

标签: .net ngen


【解决方案1】:

从代码检查

检查我们是否正在为正在执行的程序集加载本机图像。我正在加载的模块文件名属性中寻找模式“\assemblyname.ni”。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Diagnostics;

namespace MyTestsApp
{
    class Program
    {
        static bool Main(string[] args)
        {

            Process process = Process.GetCurrentProcess();

            ProcessModule[] modules = new ProcessModule[process.Modules.Count]; 
            process.Modules.CopyTo(modules,0);

            var niQuery = from m in modules where m.FileName.Contains("\\"+process.ProcessName+".ni") select m.FileName;
            bool ni = niQuery.Count()>0 ?true:false;

            if (ni)
            {
                Console.WriteLine("Native Image: "+niQuery.ElementAt(0));
            }
            else
           {
                Console.WriteLine("IL Image: " + process.MainModule.FileName);
           }

            return ni;
        }
    }
}

命令行解决方案:

在命令提示符下运行“ngen display”。

例子:

ngen display MyTestsApp.exe

如果已安装,它会打印出类似 原生图片: MyTestsApp,版本=1.0.0.0,文化=中性,PublicKeyToken=null

并返回 0 (%errorlevel%)

否则,它会打印出来:

错误:未安装指定的程序集。

并返回 -1

【讨论】:

  • 这是一个很好的解决方法,感谢您的安排。 ngen 文档缺少许多您应该期待的错误代码。
【解决方案2】:

您可以尝试在“ngen 缓存”(C:\Windows\assembly\NativeImages_v2XXXXXXX)中找到您的程序集。

Сached 程序集将具有以下格式名称: [basename].ni.[baseextension]

【讨论】:

  • Windows 7 似乎存储它们的位置略有不同,并且没有'.ni'。在名称中:C:\Windows\assembly
  • 很奇怪。我安装了 Windows 7,并且“ngen cash”路径是“C:\Windows\assembly\NativeImages_v2.0.50727_32\”。
  • 我有 Win7,您无法使用 Windows 资源管理器导航到这些文件夹。您应该在assembly 文件夹中使用cmddir
最近更新 更多