48

MS Docsで、C#コンパイル用のファイル配置を変更する方法を確認できます(プロジェクト設定とコマンドラインを使用)。

私はグーグルで検索し、512バイトのファイル配置が.dllのサイズを減らすことを説明する記事を見ました。私はさまざまなファイルの配置で自分自身をテストしましたが、そうです。

私の質問は:

別のファイル配置を使用したいのはなぜですか?これが必要なシナリオが必要ですか、それともオプションがありませんか?

また、それは正確に何をしますか?MSDNページはセクションについて話しますか?セクションとは何ですか?

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/advanced#filealignment

4

1 に答える 1

77

これは、かなり技術的な実装の詳細です。開始するには、まずPE32ファイルの構造、WindowsのDLLおよびEXEのファイル形式を理解する必要があります。そのための標準的な記事は、MattPietrikの「PEのピアリング、Win32ポータブル実行可能ファイル形式のツアー」です。17年前に書かれましたが、それでも関連性があり、利用可能です

/ filealign設定は、IMAGE_OPTIONAL_HEADER.FileAlignmentフィールドの値を参照します。セクション内の生データをどのように整列させるかを決定します。セクションは、ファイル内のコードまたはデータのチャンクです。純粋な.NETアセンブリの場合、ほぼ例外なくデータ。

ファイル形式とディスクの間には非常に密接な関係があります。実行可能イメージは、Windowsのメモリマップトファイルのバッキングファイルとして使用されます。実行可能ファイルは、ファイルを仮想メモリアドレス空間にマッピングすることによってロードされます。非常に効率的で、DLLのロードにはそのマッピングの作成のみが含まれ、ファイルから実際のデータが読み取られることはありません。これは、プロセスがセクションからバイトを読み取ろうとすると、怠惰な方法で発生します。まだメモリにロードされていない場合は、ページフォールトが発生し、オペレーティングシステムはファイルからメモリに4096バイトを読み取ります。大きな利点は、使用しないデータやコードにお金を払わないことです。また、初めて読むときに[属性]を読むのに費用がかかる理由。

ファイルの配置の関連性は、セクションの生データがどのように整列するかです。マシンコードを含む最新の実行可能ファイルのほとんどは、仮想メモリページのサイズである4096バイトの配置を使用します。これは、マネージコードを含むアセンブリにはあまり関係ありません。ILは単なるデータです。これは、スペースの浪費が少ない、より小さな配置を使用するのが理にかなっています。512バイト(キロバイトではない)はハッピー数であり、PE32形式で許可されている最小値です。

UIにオプションを追加するために私が考えることができる唯一の理由は、C#コンパイラには他のコンパイラと比較してコンパイルオプションがほとんどないことです。「その他」は、ネイティブコードを生成するコンパイラです。したがって、コンパイラにはオプションがあるため、オプションがあります。微調整の多くは[属性]でカバーされており、コンパイラのコマンドラインが短くてスッキリしています。ただし、ファイルの配置に属性はありません。ファイルを生成する前にそれを知る必要があります。属性は遅すぎます。

反対の例はC++コンパイラとリンカで、IDEはそれらを設定するための19のプロパティページを提供します。しかし、それでもすべてを網羅しているわけではありませんが、本当にあいまいなものは「コマンドライン」オプションページで設定する必要があります。

于 2011-03-05T20:25:48.537 に答える