4

アセンブリを NGEN する場合とそうでない場合のパフォーマンスへの影響を測定しようとしていますが、実行可能ファイルに NGEN アセンブリをロードさせることができません。VS2010 コマンド プロンプトから次のコマンドを実行しました。

ngen install MyApp.exe

これは問題なく完了し、すべての依存関係アセンブリが C:\Windows\assembly\NativeImages_v4.0.30319_32\MyCompanyName# ディレクトリに作成されていることを確認しました。

その後、アプリを起動して Process Explorer を見ると、NativeImages_x フォルダーから *.ni.dll ファイルを読み込むのではなく、ローカル バイナリ ディレクトリからすべてのアセンブリを読み込んでいました。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 をかなり使用します。それがアセンブリの読み込みに影響するかどうかはわかりません。

4

2 に答える 2

4

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

于 2012-04-03T20:59:09.737 に答える
1

実際の問題が何であるかはわかりませんが、解決策は、ディレクトリ内のすべてのバイナリを単純に NGEN したバッチ ファイルを作成することでした。トップレベルのexeでngen installコマンドだけを実行すると、NGEN化されていないバイナリがあったと思います。

于 2011-08-09T22:09:21.563 に答える