コード生成を制御する C# コンパイラ オプション

以下のオプションは、コンパイラによるコード生成を制御します。 新しい MSBuild 構文は太字で示されています。 以前の csc.exe 構文は、code style で示されています。

  • DebugType / -debug: デバッグ情報を生成します (または生成しません)。
  • Optimize / -optimize: 最適化を有効にします。
  • Deterministic / -deterministic: 同じ入力ソースからバイト単位で同等の出力を生成します。
  • ProduceOnlyReferenceAssembly / -refonly: 完全なアセンブリではなく、参照アセンブリをプライマリ出力として生成します。

DebugType

DebugType オプションを指定すると、コンパイラによってデバッグ情報が生成され、出力ファイルに格納されます。 デバッグ情報は既定で追加されます。

<DebugType>pdbonly</DebugType>

C# 6.0 以降のすべてのコンパイラ バージョンでは、pdbonlyfull の間に違いはありません。 pdbonly を選択してください。 .pdb ファイルの場所を変更する方法については、「PdbFile」を参照してください。

有効な値は、次のとおりです。

意味
full 現在のプラットフォームの既定の形式を使用して、.pdb ファイルにデバッグ情報を出力します。
Windows: Windows の pdb ファイル。
Linux/macOS: 移植可能な PDB ファイル。
pdbonly full と同じ。 詳細については、以下を参照してください。
portable クロスプラットフォームの移植可能な PDB 形式を使用して、デバッグ情報を .pdb ファイルに出力します。
embedded 移植可能な PDB 形式を使用して、.dll/.exe 自体 (.pdb ファイルは生成されません) にデバッグ情報を出力します。

重要

次の情報は、C# 6.0 より前のコンパイラにのみ当てはまります。 この要素の値は full または pdbonly です。 full 引数を使用すると (pdbonly を指定しない場合)、実行中のプログラムにデバッガーをアタッチできます。 pdbonly を指定すると、プログラムがデバッガーで開始されたときにはソース コードをデバッグできますが、実行中のプログラムをデバッガーにアタッチしたときはアセンブラーしか表示されません。 このオプションを使用してデバッグ ビルドを作成します。 full を使用する場合は、JIT によって最適化されるコードの速度とサイズに若干影響が生じる点に注意してください。また、full でデバッグした場合、わずかではありますが、コードの品質にも影響が生じます。 生成されるリリース コードには、pdbonly を使用するか、PDB を一切使用しないことをお勧めします。 pdbonlyfull の唯一の違いは、full でコンパイルした場合、デバッグ情報が利用可能であることを JIT コンパイラに通知するための DebuggableAttribute が生成される点です。 したがって、full を使用する場合に、コード内で DebuggableAttribute が false に設定されていると、エラーが生成されます。 アプリケーションのデバッグ パフォーマンスを構成する方法については、「イメージのデバッグの簡略化」を参照してください。

最適化

Optimize オプションは、コンパイラで実行する最適化を有効または無効にします。最適化を実行すると、出力ファイルのサイズが小さくなり、速度と効率が向上します。 "リリース" ビルド構成の場合は、Optimize オプションが既定で有効になっています。 これは、"デバッグ" およびその他のビルド構成では、既定でオフになっています。

<Optimize>true</Optimize>

Optimize オプションは、Visual Studio でプロジェクトの [ビルド] プロパティ ページから設定します。

Optimize は実行時にコードを最適化するように共通言語ランタイムに指示します。 既定では、最適化が無効になります。 Optimize+ を指定して最適化を有効にします。 モジュールをアセンブリで使用するように作成する場合は、アセンブリと同じ Optimize 設定を使用します。 Optimize オプションと Debug オプションを結合することができます。

決定的

同一の入力に対して、バイト単位の出力がコンパイル全体で同一のアセンブリをコンパイラに生成させます。

<Deterministic>true</Deterministic>

既定では、コンパイラはタイムスタンプと 乱数から生成される MVID (Module.ModuleVersionId。基本的には、モジュールとバージョンを一意に識別する GUID です) を追加するため、特定の入力セットからのコンパイラ出力は一意です。 <Deterministic> オプションを使用して、決定論的アセンブリを生成します。そのバイナリ コンテンツは、入力が同じである限り、コンパイル全体で同一になります。 このようなビルドでは、タイムスタンプおよび MVID フィールドは、すべてのコンパイル入力のハッシュから派生した値に置き換えられます。 コンパイラでは、決定性に影響する次の入力が考慮されます。

  • コマンド ライン パラメーターのシーケンス。
  • コンパイラの .rsp 応答ファイルの内容。
  • 使用されるコンパイラの正確なバージョン、およびその参照先のアセンブリ。
  • 現在のディレクトリ パス。
  • すべてのファイルのバイナリ コンテンツは、以下を含めて、直接または間接のいずれかでコンパイラに明示的に渡されます。
    • ソース ファイル
    • 参照アセンブリ
    • 参照モジュール
    • リソース
    • 厳密な名前のキー ファイル
    • @ 応答ファイル
    • アナライザー
    • ルールセット
    • アナライザーによって使用される可能性があるその他のファイル
  • 現在のカルチャ (診断と例外メッセージが生成される言語)。
  • エンコードが指定されていない場合の既定のエンコード (または現在のコード ページ)。
  • コンパイラの検索パス上のファイルの有無、および内容 (たとえば、-lib-recurse で指定)。
  • コンパイラが実行される共通言語ランタイム (CLR) プラットフォーム。
  • %LIBPATH% の値。アナライザーの依存関係の読み込みに影響する場合があります。

バイナリが信頼できる発行元からコンパイルされているかどうかを確認するために、決定論的コンパイルを使用できます。 確定的な出力は、発行元が一般公開されている場合に役立ちます。 また、ビルド プロセスで使用されるバイナリへの変更にビルド ステップが依存しているかどうかを判断することもできます。

ProduceOnlyReferenceAssembly

ProduceOnlyReferenceAssembly オプションは、実装アセンブリではなく、参照アセンブリをプライマリ出力として出力することを示します。 ProduceOnlyReferenceAssembly パラメーターは、参照アセンブリを実行できない場合に、PDB の出力を暗黙的に無効にします。

<ProduceOnlyReferenceAssembly>true</ProduceOnlyReferenceAssembly>

参照アセンブリは特殊なアセンブリです。 参照アセンブリには、ライブラリのパブリック API サーフェイスを表すために必要最小限のメタデータのみ含まれます。 これには、ビルド ツールでアセンブリを参照するときに重要なすべてのメンバーの宣言が含まれます。ただし、すべてのメンバーの実装と、その API コントラクトに影響を与えないプライベート メンバーの宣言は除外されます。 詳細については、「参照アセンブリ」を参照してください。

ProduceOnlyReferenceAssembly オプションと ProduceReferenceAssembly オプションは同時に指定できません。