How to determine if assembly has been ngen'd?
How can you determine whether a particular .Net assembly has already been ngen'd or not? I need to check from code. Even invoking the command-line 开发者_高级运维would be fine. At the moment I can't see any way of determining this.
Check From Code
Check if we are loading an native image for the executing assembly. I am looking for the pattern "\assemblyname.ni" in loaded module filename property.
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;
}
}
}
Command Line Solution:
Run "ngen display " on command prompt.
Example:
ngen display MyTestsApp.exe
If installed, it prints out something like Native Images: MyTestsApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
and returns 0 (%errorlevel%)
Otherwise, it prints out:
Error: The specified assembly is not installed.
and returns -1
You can try to find your assembly in "ngen cache" (C:\Windows\assembly\NativeImages_v2XXXXXXX).
Сached assemblies will have the following format name: [basename].ni.[baseextension].
精彩评论