C#-Compileroptionen, die die Codegenerierung steuern

Die folgenden Optionen steuern die Codegenerierung durch den Compiler. Die neue MSBuild-Syntax wird fett formatiert dargestellt. Die ältere csc.exe-Syntax wird in code style dargestellt.

  • DebugType / -debug: Gibt Debuginformationen aus (oder nicht aus).
  • Optimize / -optimize: Aktiviert Optimierungen.
  • Deterministic / -deterministic: Generiert eine Byte-für-Byte äquivalente Ausgabe aus derselben Eingabequelle.
  • ProduceOnlyReferenceAssembly / -refonly: Generiert eine Verweisassembly anstelle einer vollständigen Assembly als primäre Ausgabe.

DebugType

Die Option DebugType führt dazu, dass der Compiler Debuginformationen generiert und in mindestens einer Ausgabedatei platziert. Debugginginformationen werden standardmäßig hinzugefügt.

<DebugType>pdbonly</DebugType>

Für alle Compilerversionen ab C# 6.0 gibt es keinen Unterschied zwischen pdbonly und full. Wählen Sie pdbonly aus. Informationen zum Ändern des Speicherorts der PDB-Datei finden Sie unter PdbFile.

Folgende Werte sind gültig:

Wert Bedeutung
full Ausgeben von Debuginformationen in die PDB-Datei im Standardformat für die aktuelle Plattform:
Windows: eine Windows-PDB-Datei.
Linux/macOS: eine portierbare PDB-Datei.
pdbonly Wie in full. Weitere Informationen finden Sie im folgenden Hinweis.
portable Ausgeben von Debuginformationen in die PDB-Datei im plattformübergreifenden portablen PDB-Format.
embedded Ausgeben von Debuginformationen in die DLL-/EXE selbst (PDB-Datei wird nicht erzeugt) im portierbaren PDB-Format.

Wichtig

Die folgenden Informationen gelten nur für Compiler, die älter als C# 6.0 sind. Der Wert dieses Elements kann entweder full oder pdbonly sein. Das Argument full, das wirksam ist, wenn Sie pdbonly nicht angeben, ermöglicht das Anfügen eines Debuggers an das ausgeführte Programm. Durch die Angabe von pdbonly wird das Debuggen von Quellcode möglich, wenn das Programm im Debugger gestartet wird. Der Assembler wird jedoch nur angezeigt, wenn das aktive Programm an den Debugger angefügt ist. Verwenden Sie diese Option, um Debugbuilds zu erstellen. Wenn Sie Full verwenden, beachten Sie, dass dies Einfluss auf die Geschwindigkeit und Größe von optimiertem JIT-Code hat und die Codequalität mit full beeinträchtigt sein kann. Zum Generieren von Releasecode wird empfohlen, pdbonly oder keine PDB-Datei zu verwenden. Ein Unterschied zwischen pdbonly und full besteht darin, dass der Compiler mit full ein DebuggableAttribute-Objekt ausgibt, das den JIT-Compiler informiert, dass Debuginformationen verfügbar sind. Deshalb wird ein Fehler ausgegeben, wenn bei Verwendung von full in Ihrem Code DebuggableAttribute auf FALSE festgelegt ist. Weitere Informationen zur Konfiguration der Leistung einer Anwendung beim Debuggen finden Sie unter Erleichtern des Debuggens für ein Image.

Optimieren

Die Option Optimize aktiviert oder deaktiviert die vom Compiler durchgeführten Optimierungen, damit Ihre Ausgabedatei kleiner, schneller und effizienter wird. Die Option Optimize ist für eine Release-Buildkonfiguration standardmäßig aktiviert. Sie ist standardmäßig für ein Debug - und jede andere Buildkonfiguration deaktiviert.

<Optimize>true</Optimize>

Sie legen die Option Optimize auf der Seite Buildeigenschaften für Ihr Projekt in Visual Studio fest.

Außerdem weist Optimize die Common Language Runtime an, den Code zur Laufzeit zu optimieren. Optimierungen sind standardmäßig deaktiviert. Geben Sie Optimize an, um Optimierungen zu aktivieren. Beim Erstellen eines Moduls, das von einer Assembly verwendet werden soll, verwenden Sie dieselben Optimize-Einstellungen wie die der Assembly. Es ist möglich, die Optionen Optimize und Debug zu kombinieren.

Deterministisch

Bewirkt, dass der Compiler eine Assembly erstellt, deren Byte-für-Byte-Ausgabe über Kompilierungen identisch ist, wenn die Eingaben identisch sind.

<Deterministic>true</Deterministic>

Standardmäßig ist die Compilerausgabe aus einem bestimmten Satz von Eingaben eindeutig, da der Compiler einen Zeitstempel und eine MVID (eine Module.ModuleVersionId. Im Grunde ist es eine GUID, die das Modul und die Version eindeutig identifiziert.) hinzufügt, die aus Zufallszahlen generiert wird. Verwenden Sie die <Deterministic>-Option zum Erzeugen einer deterministischen Assembly. Deren Inhalt im Binärformat muss über Kompilierungen identisch sein, solange die Eingabe identisch ist. In einem solchen Build werden die Felder für den Zeitstempel und die MVID durch Werte ersetzt, die aus einem Hash aller Kompilierungseingaben abgeleitet wurden. Der Compiler berücksichtigt die folgenden Eingaben, die sich auf den Determinismus auswirken:

  • Die Sequenz der Befehlszeilenparameter.
  • Der Inhalt der rsp-Antwortdatei des Compilers.
  • Die genaue Version des verwendeten Compilers und seiner verwiesenen Assemblys.
  • Der aktuelle Verzeichnispfad.
  • Die binären Inhalte aller Dateien, die explizit und entweder direkt oder indirekt an den Compiler übergeben werden, einschließlich:
    • Quelldateien
    • Assemblys, auf die verwiesen wird
    • Module, auf die verwiesen wird
    • Ressourcen
    • Die Schlüsseldatei mit starkem Namen
    • @ Antwortdateien
    • Analyzer
    • RuleSets
    • Andere Dateien, die möglicherweise von Analysetools verwendet werden
  • Die aktuelle Kultur (für die Sprache, in der die Diagnose und die Ausnahmenachrichten erstellt werden).
  • Die Standardcodierung (oder die aktuelle Codepage), wenn die Codierung nicht angegeben wird.
  • Das Vorhandensein, Nichtvorhandensein und die Inhalte der Dateien auf den Suchpfaden des Compilers (z.B. von -lib oder -recurse angegeben).
  • Die CLR-Plattform (Common Language Runtime), auf der der Compiler ausgeführt wird.
  • Der Wert von %LIBPATH%, der das Abhängigkeitsladen des Analyzers beeinträchtigen kann.

Deterministische Kompilierung kann verwendet werden, um festzustellen, ob eine Binärdatei aus einer vertrauenswürdigen Quelle kompiliert wird. Die deterministische Ausgabe kann nützlich sein, wenn die Quelle öffentlich verfügbar ist. Außerdem kann festgestellt werden, ob Buildschritte, die von Änderungen in Binärdateien abhängen, im Buildprozess verwendet werden.

ProduceOnlyReferenceAssembly

Die Option ProduceOnlyReferenceAssembly gibt an, dass eine Verweisassembly statt einer Implementierungsassembly als primäre Ausgabe ausgegeben werden soll. Der Parameter ProduceOnlyReferenceAssembly deaktiviert im Hintergrund die Ausgabe von PDB-Dateien, da Verweisassemblys nicht ausgeführt werden können.

<ProduceOnlyReferenceAssembly>true</ProduceOnlyReferenceAssembly>

Verweisassemblys sind eine besondere Art von Assembly. Verweisassemblys enthalten nur die Mindestmenge an Metadaten, die zum Darstellen der öffentlichen API-Oberfläche der Bibliothek erforderlich sind. Sie beinhalten Deklarationen für alle Member, die beim Verweis auf eine Assembly in Buildtools von Bedeutung sind, schließen aber alle Memberimplementierungen und Deklarationen privater Member aus, die keine beobachtbaren Auswirkungen auf ihren API-Vertrag haben. Weitere Informationen finden Sie unter Verweisassemblys.

Die Optionen ProduceOnlyReferenceAssembly und ProduceReferenceAssembly schließen sich gegenseitig aus.