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 style
.
-
DebugType /
-debug
: Uvolněte (nebo nevysílejte) ladicí informace. -
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.
Poznámka:
Další informace o konfiguraci těchto možností pro váš projekt najdete v možnostech kompilátoru.
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
. Argument full, který platí, pokud neuvedete pdbonly, umožňuje připojení debuggeru k běžícímu programu. 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 ladicí sestavení. 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 full kompilátor generuje DebuggableAttribute, což je použito k informování kompilátoru JIT, že jsou k dispozici ladicí informace. Proto se zobrazí chyba, pokud váš kód obsahuje DebuggableAttribute nastavenou na false, pokud použijete úplnou. Další informace o konfiguraci aplikace pro ladění naleznete v tématu Jak usnadnit ladění obrazu.
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í verze Release. Ve výchozím nastavení je Debug a všechny ostatní konfigurace sestavení vypnutý.
<Optimize>true</Optimize>
V aplikaci Visual Studio nastavíte možnost Optimalizovat na stránce Vlastnosti sestavení pro váš projekt.
Optimalizovat také znamená, že modul CLR (Common Language Runtime) optimalizuje kód 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í. Je možné kombinovat možnosti Optimalizace a Ladění.
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 (v podstatě se jedná o identifikátor GUID, který jednoznačně identifikuje modul a verzi), který je generován 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
- Sady pravidel
- zdrojový odkaz data extrahovaná z úložiště (např. git commit SHA, adresa URL úložiště atd.)
- Další soubory, které můžou používat analyzátory
- Aktuální kulturní prostředí (pro jazyk, ve kterém se generují zprávy diagnostiky a výjimek).
- Výchozí kódování (nebo aktuální znaková stránka), pokud není zadané kódování.
- Existence, neexistence a obsah souborů ve vyhledávacích cestách kompilátoru (zadaných 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, zda kroky sestavení závisí na změnách binárního souboru použitých v procesu sestavení.
VytvořitPouzeReferenčníSestavení
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 vylučují všechny implementace členů a deklarace soukromých členů, které nemají žádný pozorovatelný dopad na kontrakt jejich rozhraní API. Další informace naleznete v tématu Referenční sestavení.
Možnosti ProduceOnlyReferenceAssembly a ProduceReferenceAssembly se vzájemně vylučují.