Как определить, была ли сборка ngen'd? - PullRequest
7 голосов
/ 30 января 2010

Как вы можете определить, была ли конкретная сборка .Net уже ngen'd или нет? Мне нужно проверить из кода. Даже вызов командной строки будет в порядке. На данный момент я не вижу никакого способа определить это.

Ответы [ 2 ]

6 голосов
/ 15 декабря 2013

Чек из кода

Проверьте, загружаем ли мы собственное изображение для исполняемой сборки. Я ищу шаблон "\ 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 = ноль

и возвращает 0 (% errorlevel%)

В противном случае выводится:

Ошибка: указанная сборка не установлена.

и возвращает -1

4 голосов
/ 14 февраля 2010

Вы можете попытаться найти свою сборку в «кэше ngen» (C: \ Windows \ assembly \ NativeImages_v2XXXXXXX).

Кэшированные сборки будут иметь имя в следующем формате: [базовое имя]. п . [Baseextension] .

...