Сборки NGEN не загружаются - PullRequest
4 голосов
/ 29 июня 2011

Я пытаюсь измерить влияние на производительность NGENing моих сборок, а не нет, но я не могу получить свой исполняемый файл для загрузки сборок NGEN. Я запустил следующее из командной строки VS2010:

ngen install MyApp.exe

Это завершилось без проблем, и я убедился, что все мои сборки зависимостей были созданы в каталоге C: \ Windows \ assembly \ NativeImages_v4.0.30319_32 \ MyCompanyName #.

Затем я запустил свое приложение и, глядя на Process Explorer, загружал все мои сборки из локального каталога binaries вместо загрузки файлов * .ni.dll из папки NativeImages_x. Я зарегистрировал привязки, используя fuslogvw. Вот пример записи в журнале:

*** Assembly Binder Log Entry  (6/29/2011 @ 10:14:04 AM) ***

The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable  C:\Path\To\My\Binaries\MyCompanyName.MyApp.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: User = username
LOG: DisplayName = MyCompanyName.MyAssembly, Version=1.0.2.0, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file:///C:/Path/To/My/Binaries/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = MyCompanyName.MyApp.exe
Calling assembly : MyCompanyName.AnotherAssembly, Version=1.0.2.0, Culture=neutral, PublicKeyToken=null.
===
LOG: Start binding of native image MyCompanyName.MyAssembly, Version=1.0.2.0, Culture=neutral, PublicKeyToken=null.
WRN: No matching native image found.
LOG: IL assembly loaded from C:\Path\To\My\Binaries\MyCompanyName.MyAssembly.dll

У кого-нибудь есть мысли о том, что здесь происходит? Я проверил, что рассматриваемая нативная сборка существует по адресу:

C:\Windows\assembly\NativeImages_v4.0.30319_32\MyCompanyName#\3a041121abf7fbdce89836c32f2d217e\MyCompanyName.MyAssembly.ni.dll

Почему это не связывает это правильно? FWIW, приложение использует MEF совсем немного; Я не знаю, повлияет ли это на загрузку сборок.

Ответы [ 2 ]

4 голосов
/ 04 апреля 2012

Это из-за использования MEF. NGEN может следить только за ссылками сборки. Но если вы используете MEF, вы, вероятно, не будете ссылаться на все сборки, потому что MEF отвечает за их динамическую загрузку во время выполнения.

Ваш подход правильный. Вызовите все сборки с помощью NGEN.

ngen install c:\myfiles\MyLib.dll /ExeConfig:c:\myapps\MyApp.exe

В этом случае вам необходимо вручную удалить эти сборки из кэша при удалении приложения.

ngen uninstall c:\myfiles\MyLib.dll /ExeConfig:c:\myapps\MyApp.exe

Смотри также: http://msdn.microsoft.com/en-us/library/6t9t5wcf(v=vs.100).aspx

1 голос
/ 10 августа 2011

Я не знаю, какова была настоящая проблема, но решение было написать командный файл, который просто NGEN будет каждый двоичный файл в каталоге. Я предполагаю, что были двоичные файлы, которые не были NGEN'd при запуске только команды установки ngen в exe верхнего уровня.

...