Мы разрабатываем приложение, которое значительно выигрывает от профилированных собственных образов .NET Framework.В связи с этим во время нашей установки мы выполняем следующие действия на нескольких сборках .NET:
ngen install "ASSEMBLY NAME" /Profile
Вскоре после развертывания нашего приложения мы получили жалобу на то, что пользователиФункция IntelliTrace в Visual Studio 2010 перестала работать.После непродолжительного расследования мы обнаружили, что, как только появляется Собственное изображение профилирования из mscorlib.dll , IntelliTrace перестает работать.Кроме того, когда это происходит, в средстве просмотра событий появляется следующее сообщение:
Профилировщик TraceLog обнаружил сборку NGEN / профиля, загруженную в процесс.Такие сборки не поддерживаются.Сбор будет отключен.
Это особенно беспокоит, так как mscorlib.dll является зависимостью от любой другой сборки .NET, что означает, что использование ngen install ... /profile
в любой сборке приводит к тому, что mscorlib.dll генерируется какхорошо.
Ниже приведено простое воспроизведение проблемы:
Создайте новое консольное приложение, установите его целевую платформу на .NET 2. Добавьте код, как показано визображение и установить точку останова после SomeFunction.![Sample code](https://i.stack.imgur.com/4HsHY.png)
Установите IntelliTrace на «События IntelliTrace и информация о вызовах»
Начните отладку.После достижения точки останова вы должны получить следующее: correctIntelliTrace: ![Correct IntelliTrace](https://i.stack.imgur.com/sOXO9.png)
Остановите отладку и выйдите из Visual Studio.
- Откройте новый cmd.exe врасширенный режим
- Выполнить:
%windir%\Microsoft.NET\Framework\v2.0.50727\ngen install "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /Profile
- Снова запустить Visual Studio и начать отладку.Будет достигнута та же точка останова.Однако на этот раз IntelliTrace будет выглядеть следующим образом:
![Broken IntelliTrace](https://i.stack.imgur.com/Hc0kk.png)
- Чтобы снова запустить IntelliTrace в том же окне cmd:
%windir%\Microsoft.NET\Framework\v2.0.50727\ngen uninstall "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /Profile
Мы также пытались использовать / NoDependencies флаг ngen.exe для добавления только определенных сборок, без mscorlib, однако, кажется, что этот флаг игнорируется - даже если мы выполнили ngen install ... /Profile /NoDependencies
, зависимости установлены: Запуск ngen display | find "<profiling>"
показывает, что mscorlib все еще установлен, даже если был использован флаг / NoDependencies.
Вопросы
- Есть ли способв NGEN удалить mscorlib / profile, даже если установлены другие сборки ngen / profile?
- Есть ли обходной путь для правильной работы IntelliTrace после выполнения NGen / Profile?
- Почему нетфлаг / NoDependencies работает как положено?
Спасибо, Виталий Белман