12

バイナリ構造を調べて、PEFile が .NET アセンブリであるかどうかを確認する方法をいくつか見てきました。

それは複数のファイルをテストする最速の方法ですか? 各ファイルを (たとえばAssembly.ReflectionOnlyLoadを介して) ファイルをロードしようとすると、ファイルの種類の情報がロードされるため、かなり遅くなる可能性があると思います。

注: プログラムでファイルをチェックする方法を探しています。

4

4 に答える 4

7

Stormenet の回答は技術的にはプログラム的ではないと思うので、回答を回答に分けます。

StreamReader最高のパフォーマンスを得るには、 を使用してファイルを開き、最初の (n) バイトを読み取り、バイト ストリーム内の .NET ファイル署名データ構造をチェックすることに勝るものはありません。

何かが DOS 実行可能ファイルであることを確認する方法とほとんど同じです。

http://en.wikipedia.org/wiki/DOS_executable

MS-DOS の開発者の 1 人である Mark Zbikowski のイニシャルでもある "MZ" ヘッダー バイトを探します。

于 2008-12-01T18:04:51.580 に答える
6

多分これは役立ちます

https://web.archive.org/web/20110930194955/http://www.grimes.demon.co.uk/dotnet/vistaAndDotnet.htmから

次に、それが.NETアセンブリであるかどうかを確認します。これを行うには、ファイルにCLRヘッダーが含まれているかどうかを確認します。このヘッダーには、ファイル内の.NETコードの場所と、そのコードの記述に使用されたフレームワークのバージョンに関する重要な情報が含まれています。このヘッダーの場所は、ファイルのデータディレクトリテーブルに示されています。データディレクトリ項目の値がゼロの場合、ファイルは管理されていません。ゼロ以外の値の場合、ファイルは.NETアセンブリです。

/ headersスイッチでdumpbinユーティリティを使用して、これを自分でテストできます。このユーティリティは、コマンドラインのファイルにさまざまなヘッダーを出力します。オプションのヘッダー値の最後に、データディレクトリのリストが表示され(常に16個あります)、COM記述子ディレクトリの場所がゼロ以外の場合は、ファイルが.NETアセンブリであることを示します。CLRヘッダーの内容は、/ clrheaderスイッチを使用して一覧表示することもできます(ファイルが管理されていない場合、値は表示されません)。XPは、ファイルの実行時にCLRヘッダーをテストし、CLRヘッダーが存在する場合は、ランタイムを初期化し、アセンブリのエントリポイントをランタイムに渡すため、ファイルは完全にランタイム内で実行されます。

于 2008-12-01T15:38:59.113 に答える
6

以前は AssemblyName.GetAssemblyName() を使用していましたが、これはマネージ アセンブリでない場合に例外をスローします。ただし、パフォーマンスをテストしたことがないため、どれだけ速いかはわかりません。

公式ドキュメント

于 2008-12-01T17:32:22.067 に答える
1

そこにある最初のリンクは、最も速くて簡単なチェック方法です (PE ファイル ヘッダーの方法)。Assembly.ReflectionOnlyLoad の呼び出しがかなり遅くなると仮定するのは正しいです。

于 2008-12-01T04:57:13.603 に答える