Dela via


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. Standardvärdet är portable för både debugging- och releaseversionkonfigurationer, vilket innebär att PDB-filer genereras som standard för alla konfigurationer.

<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 direkt i .dll/.exe (.pdb-filen skapas inte) med hjälp av Portable PDB-format.
none Skapa inte en PDB-fil.

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 satt 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.

Inaktivera PDB-generering för release-versioner

Om du vill förhindra PDB-filgenerering för Versionsversioner samtidigt som du behåller dem för felsökningsversioner lägger du till följande egenskap i projektfilen:

<PropertyGroup Condition="'$(Configuration)' == 'Release'">
  <DebugType>none</DebugType>
</PropertyGroup>

Du kan också ställa in DebugSymbols till false för Versionsbyggen:

<PropertyGroup Condition="'$(Configuration)' == 'Release'">
  <DebugSymbols>false</DebugSymbols>
</PropertyGroup>

Kommentar

I .NET 8 och senare versioner bör inställningen DebugSymbols till false förhindra PDB-generering enligt dokumentationen om icke-bakåtkompatibla ändringar. Det mest tillförlitliga sättet att inaktivera PDB-generering är dock att uttryckligen ange DebugType till none.

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 som standard aktiverat för en Release-konfiguration. 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 innebär också att Common Language Runtime optimerar 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 .

Deterministisk

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>

För moderna .NET-projekt aktiveras deterministisk kompilering som standard ( Deterministic egenskapen är truesom standard ). När deterministisk kompilering är aktiverad ersätts tidsstämpeln och MVID-fälten med värden som härleds från en hash för alla kompileringsindata, vilket säkerställer identiska binära utdata för identiska indata.

När deterministisk kompilering är inaktiverad (<Deterministic>false</Deterministic>) är kompilatorutdata 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. 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
    • Source Link-data som extraherats från lagringsplatsen (till exempel git commit SHA, lagringsplats-URL osv.)
    • 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 av %LIBPATH%, vilket kan påverka inläsningen av analyzerns beroenden.

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 är beroende av ändringar i den binärfil 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 utan att påtala utmatning av PDB-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.