Možnosti kompilátoru jazyka C#, které řídí generování kódu

Následující možnosti řídí generování kódu kompilátorem. Nová syntaxe nástroje MSBuild je zobrazena tučně. Starší syntaxe csc.exe je zobrazena v code stylesouboru .

  • DebugType / -debug: Vygenerujte (nebo nevysílajte) informace o ladění.
  • Optimalizace / -optimize: Povolte optimalizace.
  • Deterministické / -deterministic: Vytvoří ekvivalentní výstup bajtu pro bajt ze stejného vstupního zdroje.
  • ProduceOnlyReferenceAssembly / -refonly: Vytvoří referenční sestavení místo úplného sestavení jako primární výstup.

DebugType

Možnost DebugType způsobí, že kompilátor vygeneruje informace o ladění a umístí je do výstupního souboru nebo souborů. Ve výchozím nastavení se přidávají informace o ladění.

<DebugType>pdbonly</DebugType>

Pro všechny verze kompilátoru počínaje C# 6.0 neexistuje žádný rozdíl mezi pdbonly a úplným. Zvolte pdbonly. Pokud chcete změnit umístění souboru .pdb , přečtěte si část PdbFile.

Platné jsou následující hodnoty:

Hodnota Význam
full Vygenerujte informace o ladění do souboru .pdb pomocí výchozího formátu pro aktuální platformu:
Windows: Soubor pdb systému Windows.
Linux/macOS: Přenosný soubor PDB .
pdbonly Stejné jako full. Další informace najdete v následující poznámce.
portable Vygenerujte informace o ladění do souboru .pdb pomocí formátu Portable PDB pro různé platformy.
embedded Vygenerujte informace o ladění do samotného .dll/.exe (soubor PDB není vytvořen) pomocí formátu Portable PDB .

Důležité

Následující informace platí pouze pro kompilátory starší než C# 6.0. Hodnota tohoto prvku může být buď full nebo pdbonly. Úplný argument, který se projeví v případě, že nezadáte pdbonly, povolí připojení ladicího programu ke spuštěné aplikaci. Zadání pdbonly umožňuje ladění zdrojového kódu při spuštění programu v ladicím programu, ale zobrazí se pouze assembler při připojení spuštěného programu k ladicím programu. Pomocí této možnosti můžete vytvářet sestavení ladění. Pokud používáte Full, mějte na paměti, že je nějaký vliv na rychlost a velikost kódu optimalizovaného pro JIT a malý dopad na kvalitu kódu s plnou kvalitou. Pro generování kódu verze doporučujeme pdbonly nebo žádný PDB. Jedním z rozdílů mezi pdbonly a full je, že s úplným kompilátorem generuje , DebuggableAttributekterý se používá k informování kompilátoru JIT, že ladicí informace jsou k dispozici. Proto se zobrazí chyba, pokud váš kód obsahuje DebuggableAttribute hodnotu false, pokud použijete úplnou hodnotu. Další informace o tom, jak nakonfigurovat výkon ladění aplikace, naleznete v tématu Usnadnění ladění obrázku.

Optimalizovat

Možnost Optimalizovat povolí nebo zakáže optimalizace prováděné kompilátorem, aby byl výstupní soubor menší, rychlejší a efektivnější. Možnost Optimalizace je ve výchozím nastavení povolená pro konfiguraci sestavení vydané verze . Ve výchozím nastavení je vypnutý pro ladění a všechny ostatní konfigurace sestavení.

<Optimize>true</Optimize>

V sadě Visual Studio nastavíte možnost Optimalizovat ze stránky Vlastností sestavení pro váš projekt.

Optimalizace také říká modulu CLR (Common Language Runtime) k optimalizaci kódu za běhu. Ve výchozím nastavení jsou optimalizace zakázané. Pokud chcete povolit optimalizace, zadejte Optimize+ (Optimalizovat+ ). Při sestavování modulu, který má být používán sestavením, použijte stejné nastavení Optimalizace , jaké používá sestavení. Možnosti Optimalizace a ladění je možné kombinovat.

Deterministický

Způsobí, že kompilátor vytvoří sestavení, jehož výstup byte-for-byte je stejný napříč kompilacemi pro identické vstupy.

<Deterministic>true</Deterministic>

Ve výchozím nastavení je výstup kompilátoru z dané sady vstupů jedinečný, protože kompilátor přidá časové razítko a MVID (a Module.ModuleVersionId. V podstatě se jedná o identifikátor GUID, který jednoznačně identifikuje modul a verzi.) vygeneruje se z náhodných čísel. Tuto možnost použijete <Deterministic> k vytvoření deterministického sestavení, jehož binární obsah je identický napříč kompilacemi, pokud vstup zůstane stejný. V takovém sestavení se časové razítko a pole MVID nahradí hodnotami odvozenými z hodnoty hash všech vstupů kompilace. Kompilátor považuje následující vstupy, které ovlivňují determinismus:

  • Posloupnost parametrů příkazového řádku
  • Obsah souboru odpovědi .rsp kompilátoru.
  • Přesná verze použitého kompilátoru a jeho odkazovaná sestavení.
  • Aktuální cesta k adresáři.
  • Binární obsah všech souborů explicitně předán kompilátoru přímo nebo nepřímo, včetně:
    • Zdrojové soubory
    • Odkazovaná sestavení
    • Odkazované moduly
    • Zdroje informací
    • Soubor klíče silného názvu
    • Soubory odpovědí @
    • Analyzátory
    • Rulesets
    • Další soubory, které můžou používat analyzátory
  • Aktuální jazyková verze (pro jazyk, ve kterém se vytvářejí zprávy diagnostiky a výjimek).
  • Výchozí kódování (nebo aktuální znaková stránka), pokud není zadané kódování.
  • Existence, neexistující a obsah souborů ve vyhledávacích cestách kompilátoru (zadané například pomocí -lib nebo -recurse).
  • Platforma CLR (Common Language Runtime), na které je kompilátor spuštěn.
  • Hodnota %LIBPATH%, která může ovlivnit načítání závislostí analyzátoru.

Deterministické kompilace lze použít k určení, zda je binární soubor zkompilován z důvěryhodného zdroje. Deterministický výstup může být užitečný, pokud je zdroj veřejně dostupný. Může také určit, jestli kroky sestavení, které jsou závislé na změnách binárního souboru použitého v procesu sestavení.

ProduceOnlyReferenceAssembly

Možnost ProduceOnlyReferenceAssembly označuje, že referenční sestavení by mělo být výstupem místo sestavení implementace jako primární výstup. Parametr ProduceOnlyReferenceAssembly bezobslužně zakáže výstupy souborů PDB, protože referenční sestavení nelze spustit.

<ProduceOnlyReferenceAssembly>true</ProduceOnlyReferenceAssembly>

Referenční sestavení jsou speciálním typem sestavení. Referenční sestavení obsahují pouze minimální množství metadat potřebných k reprezentaci veřejného rozhraní API knihovny. Zahrnují deklarace pro všechny členy, které jsou významné při odkazování na sestavení v nástrojích sestavení, ale vyloučit všechny implementace členů a deklarace soukromých členů, které nemají žádný pozorovatelný dopad na jejich kontrakt rozhraní API. Další informace naleznete v tématu Referenční sestavení.

Možnosti ProduceOnlyReferenceAssembly a ProduceReferenceAssembly se vzájemně vylučují.