Ada beberapa tempat kecil di mana kode untuk proyek saya mungkin dapat ditingkatkan secara drastis jika kerangka kerja target adalah versi yang lebih baru. Saya ingin dapat memanfaatkan kompilasi bersyarat dengan lebih baik di C # untuk mengubahnya sesuai kebutuhan.
Sesuatu seperti:
#if NET40
using FooXX = Foo40;
#elif NET35
using FooXX = Foo35;
#else NET20
using FooXX = Foo20;
#endif
Apakah salah satu simbol ini datang secara gratis? Apakah saya perlu memasukkan simbol ini sebagai bagian dari konfigurasi proyek? Tampaknya cukup mudah dilakukan karena saya akan tahu kerangka mana yang menjadi target dari MSBuild.
/p:DefineConstants="NET40"
Bagaimana orang menangani situasi ini? Apakah Anda membuat konfigurasi yang berbeda? Apakah Anda meneruskan konstanta melalui baris perintah?
Jawaban:
Salah satu cara terbaik untuk melakukannya adalah dengan membuat konfigurasi build yang berbeda dalam proyek Anda:
Dan di salah satu konfigurasi default Anda:
Yang akan menyetel default jika tidak ditentukan di tempat lain. Dalam kasus di atas, OutputPath akan memberi Anda perakitan terpisah setiap kali Anda membangun setiap versi.
Kemudian buat target AfterBuild untuk mengompilasi berbagai versi Anda:
Contoh ini akan mengkompilasi ulang seluruh proyek dengan variabel Framework disetel ke NET20 setelah build pertama (mengompilasi keduanya dan mengasumsikan bahwa build pertama adalah NET35 default dari atas). Setiap kompilasi akan memiliki nilai definisi bersyarat yang disetel dengan benar.
Dengan cara ini Anda bahkan dapat mengecualikan file tertentu dalam file proyek jika Anda ingin #ifdef file:
atau bahkan referensi
sumber
Alternatif yang berhasil untuk saya sejauh ini adalah menambahkan yang berikut ini ke file proyek:
Ini mengambil nilai properti TargetFrameworkVersion, seperti "v3.5", menggantikan "v" dan "." untuk mendapatkan "NET35" (menggunakan fitur Fungsi Properti baru ). Ini kemudian menghapus nilai "NETxx" yang ada dan menambahkannya ke akhir DefinedConstants. Mungkin saja untuk merampingkan ini, tetapi saya tidak punya waktu untuk bermain-main.
Melihat pada tab Build dari properti proyek di VS Anda akan melihat nilai yang dihasilkan di bagian simbol kompilasi bersyarat. Mengubah versi kerangka kerja target pada tab Aplikasi kemudian mengubah simbol secara otomatis. Anda kemudian dapat menggunakan
#if NETxx
arahan preprocessor dengan cara biasa. Mengubah proyek di VS tampaknya tidak menghilangkan PropertyGroup kustom.Perhatikan bahwa ini tampaknya tidak memberi Anda sesuatu yang berbeda untuk opsi target Profil Klien, tetapi itu bukan masalah bagi saya.
sumber
Saya mengalami masalah dengan solusi ini, mungkin karena konstanta awal saya dibuat sebelumnya oleh properti ini.
Visual Studio 2010 juga memunculkan kesalahan karena titik koma, mengklaim bahwa mereka adalah karakter ilegal. Pesan kesalahan memberi saya petunjuk karena saya dapat melihat konstanta yang dibuat sebelumnya dipisahkan oleh koma, yang akhirnya diikuti oleh titik koma "ilegal" saya. Setelah beberapa kali memformat ulang dan memijat saya dapat menemukan solusi yang sesuai untuk saya.
Saya akan memposting tangkapan layar dari dialog Pengaturan Kompilator Lanjutan (dibuka dengan mengklik tombol "Opsi Kompilasi Lanjutan ..." pada tab Kompilasi proyek Anda). Tetapi sebagai pengguna baru, saya tidak memiliki perwakilan untuk melakukannya. Jika Anda dapat melihat tangkapan layar, Anda akan melihat konstanta khusus diisi secara otomatis oleh grup properti dan kemudian Anda akan berkata, "Saya harus memberi saya beberapa dari itu."
EDIT: Mendapat rep yang sangat cepat .. Terima kasih teman-teman! Ini tangkapan layarnya:
sumber
Mulailah dengan membersihkan konstanta:
Selanjutnya, buat debug, pelacakan, dan konstanta lainnya seperti:
Terakhir, buat konstanta framework Anda:
Saya pikir pendekatan ini sangat mudah dibaca dan dimengerti.
sumber
Dalam file .csproj, setelah
<DefineConstants>DEBUG;TRACE</DefineConstants>
baris yang ada , tambahkan ini:Lakukan ini untuk konfigurasi build Debug dan Rilis. Kemudian gunakan dalam kode Anda:
sumber
@Azarien, jawaban Anda dapat digabungkan dengan jawaban Jeremy untuk menyimpannya di satu tempat daripada Debug | Rilis dll.
Bagi saya, menggabungkan kedua variasi bekerja paling baik yaitu menyertakan kondisi dalam kode menggunakan #if NETXX dan juga membangun versi kerangka kerja yang berbeda sekaligus.
Saya memiliki ini di file .csproj saya:
dan dalam target:
sumber
Jika Anda menggunakan sistem build .NET Core, Anda dapat menggunakan simbol yang ditentukan sebelumnya (yang sebenarnya sudah cocok dengan contoh Anda dan tidak memerlukan perubahan apa pun pada Anda
.csproj
!):Daftar simbol yang telah ditentukan sebelumnya didokumentasikan di Mengembangkan Perpustakaan dengan Alat Lintas Platform dan #if (Referensi C #) :
sumber