Opcje kompilatora języka C# kontrolujące generowanie kodu
Następujące opcje kontrolują generowanie kodu przez kompilator. Nowa składnia programu MSBuild jest wyświetlana w obszarze Pogrubienie. Starsza składnia csc.exe jest pokazana w code style
.
-
DebugType /
-debug
: emituj (lub nie emituj) informacji debugowania. -
Optymalizacja /
-optimize
: włącz optymalizacje. -
Deterministyczne /
-deterministic
: Wygeneruj równoważne dane wyjściowe bajtu dla bajtów z tego samego źródła danych wejściowych. -
ProduceOnlyReferenceAssembly /
-refonly
: utwórz zestaw referencyjny zamiast pełnego zestawu jako podstawowe dane wyjściowe.
Uwaga
Aby uzyskać więcej informacji na temat konfigurowania tych opcji dla projektu, zobacz Opcje kompilatora.
Typ debugowania
Opcja DebugType powoduje, że kompilator generuje informacje debugowania i umieszcza je w pliku wyjściowym lub plikach. Informacje debugowania są domyślnie dodawane.
<DebugType>pdbonly</DebugType>
W przypadku wszystkich wersji kompilatora, począwszy od języka C# 6.0, nie ma różnicy między plikiem pdbonly i pełnym. Wybierz pdbonly. Aby zmienić lokalizację pliku .pdb, zobacz Plik Pdb.
Następujące wartości są prawidłowe:
Wartość | Znaczenie |
---|---|
full |
Emituj informacje debugowania do pliku .pdb przy użyciu formatu domyślnego dla bieżącej platformy: Windows: plik pdb systemu Windows. Linux/macOS: przenośny plik PDB . |
pdbonly |
Tak samo jak full . Aby uzyskać więcej informacji, zobacz poniższą notatkę. |
portable |
Generuj informacje debugowania do pliku .pdb, używając przenośnego formatu PDB kompatybilnego z różnymi platformami. |
embedded |
Emituj informacje debugowania do samego pliku .dll/.exe (plik pdb nie jest generowany) przy użyciu przenośnego formatu PDB. |
Ważne
Poniższe informacje dotyczą tylko kompilatorów starszych niż C# 6.0.
Wartość tego elementu może być full
lub pdbonly
. Pełny argument, który działa, jeśli nie określisz pdbonly, umożliwia dołączanie debugera do uruchomionego programu. Określenie pdbonly umożliwia debugowanie kodu źródłowego, gdy program jest uruchamiany w debugerze, ale wyświetli tylko asembler, gdy działający program zostanie podłączony do debugera. Użyj tej opcji, aby utworzyć kompilacje debugujące. Jeśli używasz opcji Full, pamiętaj, że istnieje pewien wpływ na szybkość i rozmiar zoptymalizowanego kodu JIT oraz niewielki wpływ na jakość kodu przy użyciu opcji full. Zalecamy pdbonly lub brak PDB do generowania kodu wydania. Jedną z różnic między pdbonly a pełnym jest to, że przy użyciu pełnego kompilator emituje DebuggableAttribute, co informuje kompilator JIT, że dostępne są informacje o debugowaniu. W związku z tym zostanie wyświetlony błąd, jeśli kod zawiera DebuggableAttribute ustawione na false, gdy używasz pełnej. Aby uzyskać więcej informacji na temat konfigurowania wydajności debugowania aplikacji, zobacz Making an Image Easier to Debug (Ułatwianie debugowania obrazu).
Optymalizacja
Opcja Optymalizuj włącza lub wyłącza optymalizacje wykonywane przez kompilator, aby plik wyjściowy był mniejszy, szybszy i bardziej wydajny. Opcja Optymalizuj jest domyślnie włączona w konfiguracji kompilacji wydania. Jest domyślnie wyłączony dla Debug i każdej innej konfiguracji kompilacji.
<Optimize>true</Optimize>
Ustawiasz opcję Optymalizuj na stronie Właściwości kompilacji dla swojego projektu w programie Visual Studio.
Optymalizacja również instruuje środowisko uruchomieniowe języka wspólnego, aby optymalizowało kod podczas działania. Domyślnie optymalizacje są wyłączone. Określ Optimize+, aby włączyć optymalizacje. Podczas kompilowania modułu, który ma być używany przez zestaw, użyj tych samych ustawień optymalizacji co używane przez zestaw. Można połączyć opcje Optymalizowanie i Debugowanie .
Deterministyczny
Powoduje, że kompilator tworzy zestaw, którego dane wyjściowe bajtu dla bajtów są identyczne w kompilacjach dla identycznych danych wejściowych.
<Deterministic>true</Deterministic>
Domyślnie dane wyjściowe kompilatora z danego zestawu danych wejściowych są unikatowe, ponieważ kompilator dodaje znacznik czasu i MVID (a Module.ModuleVersionId. Zasadniczo jest to identyfikator GUID, który jednoznacznie identyfikuje moduł i wersję. jest generowany na podstawie liczb losowych. Możesz użyć <Deterministic>
opcji , aby utworzyć zestaw deterministyczny, którego zawartość binarna jest identyczna w kompilacjach, o ile dane wejściowe pozostają takie same. W takiej kompilacji znacznik czasu i pola MVID zostaną zastąpione wartościami pochodzącymi z skrótu wszystkich danych wejściowych kompilacji. Kompilator uwzględnia następujące dane wejściowe wpływające na determinizm:
- Sekwencja parametrów wiersza polecenia.
- Zawartość pliku odpowiedzi rsp kompilatora.
- Dokładna wersja używanego kompilatora i jego zestawów, do których się odwołuje.
- Bieżąca ścieżka katalogu.
- Zawartość binarna wszystkich plików jawnie przekazana kompilatorowi bezpośrednio lub pośrednio, w tym:
- Pliki źródłowe
- Zestawy, do których odwołuje się odwołanie
- Moduły referencyjne
- Zasoby
- Plik klucza nazwy silnej
- @ pliki odpowiedzi
- Analizatory
- Zestawy reguł
- Link źródłowy dane wyodrębnione z repozytorium (np. SHA zatwierdzenia w Git, adres URL repozytorium itp.)
- Inne pliki, które mogą być używane przez analizatory
- Bieżąca kultura (dla języka, w którym są generowane komunikaty diagnostyczne i komunikaty o wyjątkach).
- Domyślne kodowanie (lub bieżąca strona kodowa), jeśli kodowanie nie jest określone.
- Istnienie, brak istnienia i zawartość plików w ścieżkach wyszukiwania kompilatora (określonych na przykład przez
-lib
lub-recurse
). - Platforma środowiska uruchomieniowego języka wspólnego (CLR), na której jest uruchamiany kompilator.
- Wartość
%LIBPATH%
, która może mieć wpływ na ładowanie zależności analizatora.
Kompilacja deterministyczna może służyć do ustalenia, czy plik binarny jest kompilowany z zaufanego źródła. Dane wyjściowe deterministyczne mogą być przydatne, gdy źródło jest publicznie dostępne. Może również określić, czy kroki kompilacji zależą od zmian w pliku binarnym używanym w procesie kompilacji.
ProduceOnlyReferenceAssembly
Opcja ProduceOnlyReferenceAssembly wskazuje, że zestaw referencyjny powinien być wyjściowy zamiast zestawu implementacji jako podstawowe dane wyjściowe. Parametr ProduceOnlyReferenceAssembly cicho wyłącza generowanie plików PDB, ponieważ zestawy odwołań nie mogą być wykonane.
<ProduceOnlyReferenceAssembly>true</ProduceOnlyReferenceAssembly>
Zestawy referencyjne są specjalnym typem zestawu. Zestawy odwołań zawierają tylko minimalną ilość metadanych wymaganych do reprezentowania publicznej powierzchni interfejsu API biblioteki. Obejmują deklaracje wszystkich składowych, które są istotne podczas odwoływania się do zestawu w narzędziach kompilacyjnych, ale wykluczają wszystkie implementacje składowych i deklaracje prywatnych składowych, które nie mają istotnego wpływu na kontrakt interfejsu API. Aby uzyskać więcej informacji, zobacz Zestawy referencyjne.
Opcje ProduceOnlyReferenceAssembly i ProduceReferenceAssembly wzajemnie się wykluczają.