C# и ngen.exe: Как транслировать в машинный код?

Скажу сразу: мне не нужно отказываться от платформы .NET =)
И вопрос не о том, как получить независимый от фреймворка код.

Итак, есть весомое бизнес-приложение на C# с использованием Windows Forms.
В приложении десятки различных диалоговых окон под разные нужды, уведомления о событиях трее и контекстные меню.

По хорошей традиции всё это транслируется в машинный код во время исполнения и занимает время.
Первое открытие диалогового окна, появление контекстного меню, навигация по верхнему меню - всё это занимает время и вполне ощутимо подвисает.

Разумеется, после активной работы с приложением подтормаживания исчезают.
Но это повторяется раз за разом.

Вопрос:
Я читал, что с помощью утилиты ngen можно заранее на целевой машине транслировать байт-код в машинный. Поискал на MSDN, нашел парочку примеров, в том числе смотрел через ngen /?
Попробовал применить к сборке.

Утилита отрабатывает, но результата нет: работает как работало, с медленным запуском и подтормаживанием при первой работе.

А теперь вопрос: как ей правильно пользоваться, чтобы в итоге получить корректную сборку на целевой машине?
  • Вопрос задан
  • 5513 просмотров
Решения вопроса 1
andreycha
@andreycha
1) ngen нужно применить к головному exe файлу и всем библиотекам вашей программы (сторонние библиотеки -- по желанию).
2) ngen применяется на компьютере конечного пользователя (например, как подсказали выше, во время инсталляции). Запустить ngen у себя на машине, а потом скопировать приложение пользователю -- так работать не будет.

Ну и чтобы убедиться, что во время работы приложения подгружаются действительно нативные сборки, воспользуйтесь Fuslogvw.exe из состава Visual Studio, документация есть на сайте MSDN.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
IlyaEvseev
@IlyaEvseev
Opensource geek
Альтернатива ngen: www.mono-project.com/AOT
Ответ написан
Комментировать
maxaon
@maxaon
Скорее всего вы неправильно применили утилиту. Обычно она запускается во время установки и помещает в кеш уже готовую и задеплоеную сборку. А если вы запускаете на дебаг версии, то вероятно кеш не будет использован.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы