12

ローダーが実行時にアセンブリの署名を検証せずに、またはGACされたアセンブリを使用して、ネイティブイメージが使用されているかどうかを確認するにはどうすればよいですか?

NGenで実験している複雑なシステムがありますが、現在、実行時バインディングの依存関係が多いため、すべてのDLLが配置されているフォルダーからexeを実行しています。プロセスエクスプローラーを見ると、ネイティブイメージが使用されていますが、完全なメリットが得られ、ローダーの検証手順が不要であることをどのように確認できますか?

乾杯、グレイム。

更新: アセンブリバインディングログビューアからこの種のものをたくさん取得しています:

LOG: [Level 1]Start validating IL dependency MyCompany.Entities, Version=2.0.0.0, Culture=neutral, PublicKeyToken=7cd8595f4671c5dd.
LOG: Dependency evaluation succeeded.

そして最後に

LOG: Validation of dependencies succeeded.
LOG: Start loading all the dependencies into load context.
LOG: Loading of dependencies succeeded.
LOG: Bind to native image succeeded.
Native image has correct version information.
Attempting to use native image C:\Windows\assembly\NativeImages_v2.0.50727_32\MyCompany.Mylibrary#\4710bb8309419d707681bd360088181f\MyCompany.MyLibrary.MyClass.ni.dll.
ZAP: Native image has been relocated.
Native image successfully used.

したがって、ネイティブイメージを使用していますが、それらを検証しています。つまり、ネイティブイメージを作成した場所であるにもかかわらず、GACバージョンを使用していません。

ngen install "MyCompany.Entites, Version=2.0.0.0, Culture=neutral, PublicKeyToken=7cd8595f4671c5dd, processorArchitecture=MSIL"

脚注: この記事は、アセンブリがGACからロードされていない場合、検証プロセスがNGenの利点を相殺することを示唆しているようです。 CLR Inside Out-アプリケーション起動パフォーマンス(MSDN)の改善

更新-Nobugzが以下のコメントで指摘しているように、3.5 SP1以降、上記の検証手順は実行されません。NGenのMSDNドキュメントを参照してください。

4

3 に答える 3

12

Fuslogvw.exeツールから簡単に確認できます。VisualStudioのコマンドプロンプトから起動します。ログカテゴリ=ネイティブイメージ、設定+ディスクへのすべてのバインドをログに記録して構成します。プログラムを実行します。fuslogvwに戻り、更新します。ロードされたすべてのアセンブリのリストが表示されます。

エントリをダブルクリックして、アセンブリがどのようにロードされたかを確認します。GACからのものである場合は、次のように表示されます。

ログ:C:\ Windows \ assembly \ GAC_MSIL\blahblahから読み込まれたILアセンブリ

Ngen-ed画像が使用された場合は、次のように表示されます。

ログ:ネイティブイメージへのバインドに成功しました。

于 2010-02-17T17:38:19.493 に答える
3

アセンブリがGACからのものであるかどうかを簡単に確認できます。

Assembly assembly = Assembly.GetExecutingAssembly();

if (assembly.GlobalAssemblyCache)
{
    Console.WriteLine("I'm in the GAC!");
}

編集:方法を見つけました...

NGENされているかどうかを確認するには、アセンブリを直接読み取り、プリコンパイルヘッダーフィールドにこのページのデータが含まれているかどうかを確認する必要があります。私はその値に到達するのに少し錆びていますが、それでうまくいくはずです。反射法でそれを理解する方法がわかりません。

于 2010-02-17T16:35:25.863 に答える
1

VMMAPを使用できます。そこでは、すべての.dll(アセンブリ)に場所の詳細があります

詳細には、アセンブリが「C:\ Windows \ assembly \ NativeImages(version)...」から読み込まれているため、アプリケーションがネイティブイメージを使用している場合。

于 2016-10-17T13:16:25.790 に答える