C#-kompilatoralternativ som styr kodgenerering

Följande alternativ styr kodgenereringen av kompilatorn. Den nya MSBuild-syntaxen visas i Fetstil. Den äldre csc.exe syntaxen visas i code style.

  • Felsökningstyp / -debug: Generera (eller generera inte) felsökningsinformation.
  • Optimera / -optimize: Aktivera optimeringar.
  • Deterministisk / -deterministic: Producera byte-för-byte-ekvivalent utdata från samma indatakälla.
  • ProduceOnlyReferenceAssembly / -refonly: Skapa en referenssammansättning i stället för en fullständig sammansättning som primära utdata.

DebugType

Alternativet DebugType gör att kompilatorn genererar felsökningsinformation och placerar den i utdatafilen eller filerna. Felsökningsinformation läggs till som standard.

<DebugType>pdbonly</DebugType>

För alla kompilatorversioner som börjar med C# 6.0 finns det ingen skillnad mellan pdbonly och full. Välj pdbonly. Information om hur du ändrar platsen för .pdb-filen finns i PdbFile.

Följande värden är giltiga:

Värde Innebörd
full Generera felsökningsinformation till .pdb-filen med standardformatet för den aktuella plattformen:
Windows: En Windows pdb-fil.
Linux/macOS: En bärbar PDB-fil .
pdbonly Samma som full. Mer information finns i anteckningen nedan.
portable Skicka felsökningsinformation till .pdb-filen med hjälp av plattformsoberoende portable PDB-format.
embedded Generera felsökningsinformation i själva .dll/.exe (.pdb-filen produceras inte) med hjälp av portable PDB-format .

Viktigt!

Följande information gäller endast för kompilatorer som är äldre än C# 6.0. Värdet för det här elementet kan vara antingen full eller pdbonly. Det fullständiga argumentet, som gäller om du inte anger pdbonly, aktiverar anslutning av ett felsökningsprogram till det program som körs. Om du anger pdbonly kan du felsöka källkod när programmet startas i felsökningsprogrammet, men det visar bara assembler när det program som körs är kopplat till felsökningsprogrammet. Använd det här alternativet för att skapa felsökningsversioner. Om du använder Full bör du vara medveten om att det finns en viss inverkan på hastigheten och storleken på JIT-optimerad kod och en liten inverkan på kodkvaliteten med full. Vi rekommenderar pdbonly eller inget PDB för att generera versionskod. En skillnad mellan pdbonly och full är att kompilatorn med full genererar en DebuggableAttribute, som används för att berätta för JIT-kompilatorn att felsökningsinformation är tillgänglig. Därför får du ett felmeddelande om koden innehåller DebuggableAttribute uppsättningen till false om du använder fullständig. Mer information om hur du konfigurerar felsökningsprestanda för ett program finns i Göra en bild enklare att felsöka.

Optimera

Alternativet Optimera aktiverar eller inaktiverar optimeringar som utförs av kompilatorn för att göra utdatafilen mindre, snabbare och effektivare. Alternativet Optimera är aktiverat som standard för en versionskonfiguration . Den är inaktiverad som standard för felsökning och andra byggkonfigurationer.

<Optimize>true</Optimize>

Du anger alternativet Optimera från sidan Skapa egenskaper för projektet i Visual Studio.

Optimera talar också om för den vanliga språkkörningen att optimera kod vid körning. Som standard inaktiveras optimeringar. Ange Optimera+ för att aktivera optimeringar. När du skapar en modul som ska användas av en sammansättning använder du samma optimeringsinställningar som används av sammansättningen. Du kan kombinera alternativen Optimera och Felsöka .

Deterministiska

Gör att kompilatorn skapar en sammansättning vars byte-för-byte-utdata är identiska mellan kompileringar för identiska indata.

<Deterministic>true</Deterministic>

Som standard är kompilatorns utdata från en viss uppsättning indata unika, eftersom kompilatorn lägger till en tidsstämpel och en MVID (en Module.ModuleVersionId. I grund och botten är det ett GUID som unikt identifierar modulen och versionen.) som genereras från slumpmässiga tal. Du använder <Deterministic> alternativet för att skapa en deterministisk sammansättning, en vars binära innehåll är identiskt mellan kompileringar så länge indata förblir desamma. I en sådan version ersätts tidsstämpeln och MVID-fälten med värden som härleds från en hash för alla kompileringsindata. Kompilatorn tar hänsyn till följande indata som påverkar determinism:

  • Sekvensen med kommandoradsparametrar.
  • Innehållet i kompilatorns .rsp-svarsfil.
  • Den exakta versionen av kompilatorn som används och dess refererade sammansättningar.
  • Den aktuella katalogsökvägen.
  • Det binära innehållet i alla filer som uttryckligen skickas till kompilatorn antingen direkt eller indirekt, inklusive:
    • Källfiler
    • Refererade sammansättningar
    • Refererade moduler
    • Resurser
    • Den starka namnnyckelfilen
    • @ svarsfiler
    • Analysverktyg
    • Regeluppsättningar
    • Andra filer som kan användas av analysverktyg
  • Den aktuella kulturen (för det språk där diagnostik- och undantagsmeddelanden skapas).
  • Standardkodning (eller aktuell kodsida) om kodningen inte har angetts.
  • Förekomsten, icke-existensen och innehållet i filer på kompilatorns sökvägar (anges till exempel av -lib eller -recurse).
  • CLR-plattformen (Common Language Runtime) som kompilatorn körs på.
  • Värdet för , som kan påverka inläsning av %LIBPATH%analysverktygsberoende.

Deterministisk kompilering kan användas för att fastställa om en binär fil kompileras från en betrodd källa. Deterministiska utdata kan vara användbara när källan är offentligt tillgänglig. Den kan också avgöra om byggsteg som är beroende av ändringar i binärfilen som används i byggprocessen.

ProduceOnlyReferenceAssembly

Alternativet ProduceOnlyReferenceAssembly anger att en referenssammansättning ska vara utdata i stället för en implementeringssammansättning, som primära utdata. Parametern ProduceOnlyReferenceAssembly inaktiverar tyst utdata för PDF-filer eftersom referenssammansättningar inte kan köras.

<ProduceOnlyReferenceAssembly>true</ProduceOnlyReferenceAssembly>

Referenssammansättningar är en särskild typ av sammansättning. Referenssammansättningar innehåller endast den minsta mängd metadata som krävs för att representera bibliotekets offentliga API-yta. De innehåller deklarationer för alla medlemmar som är viktiga när de refererar till en sammansättning i byggverktyg, men exkluderar alla medlemsimplementeringar och deklarationer av privata medlemmar som inte har någon observerbar inverkan på deras API-kontrakt. Mer information finns i Referenssammansättningar.

Alternativen ProduceOnlyReferenceAssembly och ProduceReferenceAssembly utesluter varandra.