Opsi Pengompilasi C# yang mengontrol pembuatan kode

Opsi berikut mengontrol pembuatan kode oleh pengompilasi. Sintaksis MSBuild baru ditampilkan dalam Huruf tebal. Sintaks csc.exe yang lebih lama ditampilkan dalam huruf code style.

  • DebugType / -debug: Mengeluarkan (atau tidak mengeluarkan) informasi penelusuran kesalahan.
  • Optimize / -optimize: Mengaktifkan pengoptimalan.
  • Deterministic / -deterministic: Menghasilkan output setara byte-for-byte dari sumber input yang sama.
  • ProduceOnlyReferenceAssembly / -refonly: Menghasilkan rakitan referensi, bukan rakitan lengkap, sebagai output utama.

DebugType

Opsi DebugType menyebabkan pengompilasi menghasilkan informasi penelusuran kesalahan dan menempatkannya dalam file atau file output. Informasi penelusuran kesalahan ditambahkan secara default.

<DebugType>pdbonly</DebugType>

Untuk semua versi pengompilasi yang dimulai dengan C# 6.0, tidak ada perbedaan antara pdbonly dan full. Pilih pdbonly. Untuk mengubah lokasi file .pdb, lihat PdbFile.

Nilai berikut ini valid:

Nilai Makna
full Keluarkan informasi penelusuran kesalahan ke file .pdb menggunakan format default untuk platform saat ini:
Windows: File pdb Windows.
Linux/macOS: File PDB Portabel.
pdbonly Sama seperti full. Lihat catatan di bawah ini untuk informasi selengkapnya.
portable Keluarkan informasi penelusuran kesalahan ke file .pdb menggunakan format PDB Portabel lintas platform.
embedded Keluarkan informasi penelusuran kesalahan ke .dll/.exe itu sendiri (file.pdb tidak diproduksi) menggunakan format PDB Portabel.

Penting

Informasi berikut hanya berlaku untuk pengompilasi dengan versi yang lebih lama dari C# 6.0. Nilai elemen ini dapat berupa full atau pdbonly. Argumen full, yang berlaku jika Anda tidak menentukan pdbonly, memungkinkan pelampiran debugger ke program yang sedang berjalan. Penentuan pdbonly memungkinkan penelusuran kesalahan kode sumber saat program dimulai di debugger, tetapi hanya akan menampilkan perakit ketika program yang sedang berjalan dilampirkan ke debugger. Gunakan opsi ini untuk membuat build debug. Jika Anda menggunakan Full, ketahuilah bahwa ada beberapa dampak pada kecepatan dan ukuran kode yang dioptimalkan JIT dan dampak kecil pada kualitas kode dengan full. Kami menyarankan pdbonly atau tanpa PDB untuk menghasilkan kode rilis. Salah satu perbedaan antara pdbonly dan full adalah bahwa dengan full pengompilasi mengeluarkan DebuggableAttribute, yang digunakan untuk memberi tahu pengompilasi JIT bahwa informasi debug tersedia. Oleh karena itu, Anda akan mendapatkan kesalahan jika kode Anda berisi DebuggableAttribute yang diatur ke false jika Anda menggunakan full. Untuk informasi selengkapnya tentang cara mengonfigurasi performa debug aplikasi, lihat Membuat Gambar Lebih Mudah Di-debug.

Optimalkan

Opsi Optimize mengaktifkan atau menonaktifkan pengoptimalan yang dilakukan oleh pengompilasi untuk membuat file output Anda lebih kecil, lebih cepat, dan lebih efisien. Opsi Optimize diaktifkan secara default untuk konfigurasi build Rilis. Ini nonaktif secara default untuk Debug dan konfigurasi build lainnya.

<Optimize>true</Optimize>

Anda menetapkan opsi Optimize dari halaman properti build untuk proyek Anda di Visual Studio.

Optimize juga memberi tahu runtime bahasa umum untuk mengoptimalkan kode pada saat run-time. Secara default, pengoptimalan dinonaktifkan. Tentukan Optimize+ untuk mengaktifkan pengoptimalan. Saat membuat modul yang akan digunakan oleh rakitan, gunakan pengaturan Optimize yang sama seperti yang digunakan oleh rakitan. Dimungkinkan untuk menggabungkan opsi Optimize dan Debug.

Deterministic

Menyebabkan pengompilasi menghasilkan perakitan yang output byte-for-byte-nya identik di seluruh kompilasi untuk input yang identik.

<Deterministic>true</Deterministic>

Secara default, output compiler dari sekumpulan input tertentu unik, karena pengkompilasi menambahkan tanda waktu dan MVID (. Module.ModuleVersionId Pada dasarnya ini adalah GUID yang secara unik mengidentifikasi modul dan versi.) yang dihasilkan dari angka acak. Anda menggunakan opsi <Deterministic> untuk menghasilkan rakitan deterministik, yang konten binernya identik di seluruh kompilasi selama input tetap sama. Dalam build seperti itu, stempel waktu dan bidang MVID akan diganti dengan nilai yang berasal dari hash semua input kompilasi. Pengompilasi mempertimbangkan input berikut yang memengaruhi determinisme:

  • Urutan parameter baris perintah.
  • Konten file respons .rsp pengompilasi.
  • Versi yang tepat dari pengompilasi yang digunakan, dan rakitan referensinya.
  • Jalur direktori saat ini.
  • Konten biner dari semua file secara eksplisit diteruskan ke pengkompilasi baik secara langsung maupun tidak langsung, termasuk:
    • File sumber
    • Rakitan referensi
    • Modul referensi
    • Sumber
    • File kunci nama kuat
    • file respons @
    • Penganalisis
    • Set aturan
    • File lain yang dapat digunakan oleh penganalisis
  • Budaya saat ini (untuk bahasa di mana pesan diagnostik dan pengecualian diproduksi).
  • Pengodean default (atau halaman kode saat ini) jika pengodean tidak ditentukan.
  • Keberadaan, ketiadaan, dan konten file pada jalur pencarian pengompilasi (ditentukan, misalnya, oleh -lib atau -recurse).
  • Platform Runtime Bahasa Umum (Common Language Runtime - CLR) tempat pengompilasi berjalan.
  • Nilai %LIBPATH%, yang dapat mempengaruhi pemuatan dependensi penganalisis.

Kompilasi deterministic dapat digunakan untuk menetapkan apakah suatu biner dikompilasi dari sumber terpercaya. Output deterministic dapat berguna jika sumber tersedia untuk umum. Ini juga dapat menentukan apakah langkah build yang bergantung pada perubahan terhadap biner digunakan dalam proses build.

ProduceOnlyReferenceAssembly

Opsi ProduceOnlyReferenceAssembly menunjukkan bahwa rakitan referensi harus berupa output dan bukan rakitan implementasi, sebagai output utama. Parameter ProduceOnlyReferenceAssembly secara diam-diam menonaktifkan output PDB, karena rakitan referensi tidak dapat dijalankan.

<ProduceOnlyReferenceAssembly>true</ProduceOnlyReferenceAssembly>

Rakitan referensi adalah jenis rakitan khusus. Rakitan referensi hanya berisi jumlah minimum metadata yang diperlukan untuk mewakili permukaan API publik pustaka. Ini termasuk deklarasi untuk semua anggota yang signifikan saat merujuk rakitan dalam alat build, tetapi mengecualikan semua implementasi anggota dan deklarasi anggota swasta yang tidak memiliki dampak yang dapat diamati pada kontrak API-nya. Untuk informasi selengkapnya, lihat Rakitan referensi.

Opsi ProduceOnlyReferenceAssembly dan ProduceReferenceAssembly bersifat eksklusif secara mutual.