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 wyświetlana w pliku 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 pozycję 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 |
Emituj informacje debugowania do pliku .pdb przy użyciu międzyplatformowego przenośnego formatu PDB . |
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 mieć full
wartość lub pdbonly
. Pełny argument, który jest w mocy, jeśli nie określisz pliku pdbonly, umożliwia dołączanie debugera do uruchomionego programu. Określenie pliku pdbonly umożliwia debugowanie kodu źródłowego podczas uruchamiania programu w debugerze, ale będzie wyświetlać asemblera tylko wtedy, gdy uruchomiony program jest dołączony do debugera. Użyj tej opcji, aby utworzyć kompilacje debugowania. Jeśli używasz funkcji Full, pamiętaj, że istnieje pewien wpływ na szybkość i rozmiar zoptymalizowanego kodu JIT oraz niewielki wpływ na jakość kodu z pełnym użyciem. Zalecamy pdbonly lub brak pdB do generowania kodu wydania. Jedną z różnic między plikiem pdbonly i pełnym jest to, że z pełnym kompilatorem DebuggableAttributeemituje element , który służy do informowania kompilatora JIT, że dostępne są informacje o debugowaniu. W związku z tym zostanie wyświetlony błąd, jeśli kod zawiera DebuggableAttribute zestaw wartości false, jeśli używasz pełnej wartości. 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 dla konfiguracji kompilacji wydania . Jest on domyślnie wyłączony dla debugowania i dowolnej innej konfiguracji kompilacji.
<Optimize>true</Optimize>
Należy ustawić opcję Optymalizuj na stronie Właściwości kompilacji dla projektu w programie Visual Studio.
Optymalizacja informuje również środowisko uruchomieniowe języka wspólnego o optymalizacji kodu w czasie wykonywania. Domyślnie optymalizacje są wyłączone. Określ pozycję Optimize+ (Optymalizowanie+ ), 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, do których odwołuje się odwołanie
- Zasoby
- Plik klucza silnej nazwy
- @ pliki odpowiedzi
- Analizatory
- Zestawy reguł
- 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, które są zależne 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 dyskretnie wyłącza wyprowadzanie plików PDB, ponieważ nie można wykonać zestawów odwołań.
<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 elementów członkowskich, które są istotne podczas odwoływania się do zestawu w narzędziach kompilacji, ale wykluczają wszystkie implementacje składowych i deklaracje prywatnych elementów członkowskich, które nie mają zauważalnego wpływu na kontrakt interfejsu API. Aby uzyskać więcej informacji, zobacz Zestawy referencyjne.
Opcje ProduceOnlyReferenceAssembly i ProduceReferenceAssembly wzajemnie się wykluczają.