AssemblyVersion
Di mana majelis lain yang merujuk majelis Anda akan melihat. Jika nomor ini berubah, majelis lain harus memperbarui referensi mereka ke majelis Anda! Hanya perbarui versi ini, jika rusak kompatibilitas. The AssemblyVersion
diperlukan.
Saya menggunakan format: major.minor . Ini akan menghasilkan:
[assembly: AssemblyVersion("1.0")]
Jika Anda mengikuti SemVer dengan ketat maka ini berarti Anda hanya memperbarui ketika perubahan besar , jadi 1.0, 2.0, 3.0, dll.
AssemblyFileVersion
Digunakan untuk penyebaran. Anda dapat menambah nomor ini untuk setiap penyebaran. Ini digunakan oleh program pengaturan. Gunakan untuk menandai majelis yang memiliki hal yang samaAssemblyVersion
, tetapi dihasilkan dari bangunan yang berbeda.
Di Windows, itu dapat dilihat di properti file.
AssemblyFileVersion adalah opsional. Jika tidak diberikan, AssemblyVersion digunakan.
Saya menggunakan format: major.minor.patch.build , di mana saya mengikuti SemVer untuk tiga bagian pertama dan menggunakan buildnumber dari buildserver untuk bagian terakhir (0 untuk local build). Ini akan menghasilkan:
[assembly: AssemblyFileVersion("1.3.2.254")]
Ketahuilah bahwa System.Version menyebut bagian-bagian ini sebagai major.minor.build.revision
!
AssemblyInformationalVersion
Versi produk perakitan. Ini adalah versi yang akan Anda gunakan ketika berbicara dengan pelanggan atau untuk ditampilkan di situs web Anda. Versi ini bisa berupa string, seperti ' 1.0 Release Calon '.
Ini AssemblyInformationalVersion
opsional. Jika tidak diberikan, AssemblyFileVersion digunakan.
Saya menggunakan format: major.minor [.patch] [revisi as string] . Ini akan menghasilkan:
[assembly: AssemblyInformationalVersion("1.0 RC1")]
major.minor[.build[.revision]]
dan tidakmajor.minor.revision.build
demikian dalam jawaban yang diberikan angka build dan revisi akan ditukar jika Anda menggunakan properti kelas atauSystem.Reflection.Assembly.GetExecutingAssembly().GetName().Version
untuk mendeteksi nomor build dan revisi.AssemblyInformationalVersion
, jika dihilangkan,AssemblyFileVersion
digunakan. LaluAssemblyVersion
jika keduanya dihilangkan.Versi rakitan di. NET bisa menjadi prospek yang membingungkan mengingat bahwa saat ini setidaknya ada tiga cara untuk menentukan versi untuk rakitan Anda.
Berikut adalah tiga atribut perakitan terkait versi utama:
Dengan konvensi, empat bagian dari versi ini disebut sebagai Versi Utama , Versi Kecil , Build , dan Revisi .
Hal
AssemblyFileVersion
ini dimaksudkan untuk mengidentifikasi secara unik bangunan dari perakitan individuBiasanya Anda akan secara manual mengatur Major dan Minor AssemblyFileVersion untuk mencerminkan versi perakitan, lalu menambah Build dan / atau Revisi setiap kali sistem build Anda mengkompilasi assembly. AssemblyFileVersion harus memungkinkan Anda mengidentifikasi secara unik susunan perakitan, sehingga Anda dapat menggunakannya sebagai titik awal untuk debugging masalah apa pun.
Pada proyek saya saat ini, kami memiliki server build yang menyandikan nomor daftar perubahan dari repositori kontrol sumber kami ke bagian Build and Revision dari AssemblyFileVersion. Ini memungkinkan kita untuk memetakan langsung dari rakitan ke kode sumbernya, untuk rakitan apa pun yang dihasilkan oleh server build (tanpa harus menggunakan label atau cabang dalam kontrol sumber, atau secara manual menyimpan catatan dari versi yang dirilis).
Nomor versi ini disimpan di sumber daya versi Win32 dan dapat dilihat saat melihat halaman properti Windows Explorer untuk perakitan.
CLR tidak peduli atau memeriksa AssemblyFileVersion.
Ini
AssemblyInformationalVersion
dimaksudkan untuk mewakili versi seluruh produk AndaAssemblyInformationalVersion dimaksudkan untuk memungkinkan versi yang koheren dari seluruh produk, yang dapat terdiri dari banyak majelis yang versi independen, mungkin dengan kebijakan versi berbeda, dan berpotensi dikembangkan oleh tim yang berbeda.
CLR tidak peduli atau memeriksa AssemblyInformationalVersion.
Ini
AssemblyVersion
adalah satu-satunya versi yang CLR pedulikan (tetapi peduli tentang keseluruhanAssemblyVersion
)AssemblyVersion digunakan oleh CLR untuk mengikat majelis yang bernama kuat. Ini disimpan dalam tabel metadata manifes AssemblyDef dari perakitan yang dibangun, dan di tabel AssemblyRef dari setiap perakitan yang merujuknya.
Ini sangat penting, karena itu berarti bahwa ketika Anda mereferensikan sebuah rakitan yang bernama kuat, Anda terikat dengan ketat ke AssemblyVersion spesifik dari rakitan itu. Seluruh AssemblyVersion harus benar-benar cocok agar pengikatan berhasil. Misalnya, jika Anda mereferensikan versi 1.0.0.0 dari rakitan sangat bernama pada waktu-bangun, tetapi hanya versi 1.0.0.1 dari rakitan itu yang tersedia saat runtime, pengikatan akan gagal! (Anda kemudian harus mengatasi ini menggunakan Peredaran Pengikatan Majelis .)
Kebingungan apakah keseluruhan
AssemblyVersion
harus cocok. (Ya, benar.)Ada sedikit kebingungan di sekitar apakah seluruh AssemblyVersion harus sama persis agar perakitan dapat dimuat. Beberapa orang berada di bawah kepercayaan yang salah bahwa hanya bagian-bagian Besar dan Kecil dari AssemblyVersion yang harus cocok untuk mengikat agar berhasil. Ini adalah asumsi yang masuk akal, namun pada akhirnya tidak benar (pada. NET 3.5), dan ini sepele untuk memverifikasi ini untuk versi CLR Anda. Eksekusi kode contoh ini .
Pada mesin saya, beban perakitan kedua gagal, dan dua baris terakhir log fusi membuatnya sangat jelas mengapa:
Saya pikir sumber kebingungan ini mungkin karena Microsoft awalnya dimaksudkan untuk menjadi sedikit lebih lunak pada pencocokan ketat dari AssemblyVersion lengkap ini, dengan mencocokkan hanya pada bagian versi Major dan Minor:
Ini adalah perilaku dalam Beta 1 dari 1.0 CLR, namun fitur ini telah dihapus sebelum rilis 1.0, dan belum berhasil muncul kembali di .NET 2.0:
Karena perubahan ini masih belum diterapkan, saya pikir aman untuk mengasumsikan bahwa Microsoft telah melacak kembali maksud ini, dan mungkin sudah terlambat untuk mengubahnya sekarang. Saya mencoba mencari di web untuk mengetahui apa yang terjadi dengan rencana ini, tetapi saya tidak dapat menemukan jawaban. Saya masih ingin mencapai bagian bawahnya.
Jadi saya mengirim email kepada Jeff Richter dan menanyakannya langsung - saya pikir jika ada yang tahu apa yang terjadi, itu pasti dia.
Dia menjawab dalam waktu 12 jam, pada hari Sabtu pagi tidak kurang, dan mengklarifikasi bahwa .NET 1.0 Beta 1 loader benar-benar menerapkan mekanisme 'roll-forward' otomatis ini untuk mengambil Build and Revision terbaru dari sebuah majelis, tetapi perilaku ini adalah dikembalikan sebelum .NET 1.0 dikirimkan. Itu kemudian dimaksudkan untuk menghidupkan kembali ini tetapi tidak berhasil sebelum CLR 2.0 dikirimkan. Kemudian datang Silverlight, yang mengambil prioritas untuk tim CLR, sehingga fungsi ini tertunda lebih lanjut. Sementara itu, sebagian besar orang yang ada di sekitar zaman CLR 1.0 Beta 1 telah pindah, jadi tidak mungkin hal ini akan melihat cahaya hari, terlepas dari semua kerja keras yang telah dimasukkan ke dalamnya.
Tingkah laku saat ini, tampaknya, ada di sini untuk tinggal.
Perlu juga dicatat dari diskusi saya dengan Jeff bahwa AssemblyFileVersion hanya ditambahkan setelah penghapusan mekanisme 'roll-forward otomatis' - karena setelah 1.0 Beta 1, setiap perubahan pada AssemblyVersion adalah perubahan besar bagi pelanggan Anda, ada kemudian tidak ada tempat untuk menyimpan nomor build Anda dengan aman. AssemblyFileVersion adalah tempat yang aman, karena tidak pernah secara otomatis diperiksa oleh CLR. Mungkin lebih jelas seperti itu, memiliki dua nomor versi yang terpisah, dengan makna yang terpisah, daripada mencoba untuk membuat pemisahan antara bagian-bagian Mayor / Minor (melanggar) dan Build / Revisi (tidak melanggar) dari AssemblyVersion.
Intinya: Pikirkan baik-baik tentang kapan Anda mengubah
AssemblyVersion
Moralnya adalah jika Anda mengirim rakitan yang akan dirujuk oleh pengembang lain, Anda harus sangat berhati-hati saat Anda melakukan (dan tidak) mengubah AssemblyVersion dari rakitan tersebut. Setiap perubahan pada AssemblyVersion akan berarti bahwa pengembang aplikasi harus mengkompilasi ulang terhadap versi baru (untuk memperbarui entri AssemblyRef tersebut) atau menggunakan pengalihan ikatan perakitan untuk secara manual mengesampingkan pengikatan.
Coba lihat lagi atribut versi di mscorlib:
Perhatikan bahwa itu adalah AssemblyFileVersion yang berisi semua informasi servis yang menarik (bagian Revisi dari versi ini yang memberi tahu Anda apa Paket Layanan yang Anda pakai), sementara itu AssemblyVersion diperbaiki pada versi 2.0.0.0 yang lama dan membosankan. Setiap perubahan pada AssemblyVersion akan memaksa setiap aplikasi .NET mereferensikan mscorlib.dll untuk mengkompilasi ulang terhadap versi baru!
sumber
AssemblyVersion
cukup banyak tetap internal untuk. NET, sementaraAssemblyFileVersion
apa yang dilihat Windows. Jika Anda pergi ke properti perakitan yang duduk di direktori dan beralih ke tab versi, theAssemblyFileVersion
itulah yang akan Anda lihat di bagian atas. Jika Anda mengurutkan file berdasarkan versi, inilah yang digunakan oleh Explorer.Itu
AssemblyInformationalVersion
memetakan ke "Versi Produk" dan dimaksudkan untuk menjadi murni "manusia-digunakan".AssemblyVersion
tentu saja yang paling penting, tetapi saya juga tidak akan melewatkannyaAssemblyFileVersion
. Jika Anda tidak menyediakanAssemblyInformationalVersion
, kompiler menambahkannya untuk Anda dengan menghapus bagian "revisi" dari nomor versi Anda dan meninggalkan major.minor.build.sumber
AssemblyInformationalVersion
danAssemblyFileVersion
ditampilkan ketika Anda melihat informasi "Versi" pada file melalui Windows Explorer dengan melihat properti file. Atribut-atribut ini sebenarnya dikompilasi keVERSION_INFO
sumber daya yang dibuat oleh kompiler.AssemblyInformationalVersion
adalah nilai "Versi produk".AssemblyFileVersion
adalah nilai "Versi file".Ini
AssemblyVersion
khusus untuk .NET assemblies dan digunakan oleh .NET assembly loader untuk mengetahui versi perakitan mana yang akan dimuat / diikat saat runtime.Dari semua ini, satu-satunya yang mutlak diperlukan oleh .NET adalah
AssemblyVersion
atribut. Sayangnya itu juga dapat menyebabkan masalah paling banyak ketika itu berubah tanpa pandang bulu, terutama jika Anda kuat memberi nama majelis Anda.sumber
Untuk menjaga pertanyaan ini tetap terkini, perlu disorot yang
AssemblyInformationalVersion
digunakan oleh NuGet dan mencerminkan versi paket termasuk akhiran pra-rilis apa pun.Sebagai contoh, AssemblyVersion 1.0.3. * Dikemas dengan inti asp.net dotnet-cli
Menghasilkan paket dengan versi 1.0.3-ci-7 yang dapat Anda periksa dengan refleksi menggunakan:
sumber
Perlu dicatat beberapa hal lain:
1) Seperti ditunjukkan dalam dialog Windows Explorer Properties untuk file assembly yang dihasilkan, ada dua tempat yang disebut "Versi file". Yang terlihat di header dialog menunjukkan AssemblyVersion, bukan AssemblyFileVersion.
Di bagian informasi versi lain, ada elemen lain yang disebut "Versi File". Di sinilah Anda bisa melihat apa yang dimasukkan sebagai AssemblyFileVersion.
2) AssemblyFileVersion hanyalah teks biasa. Itu tidak harus sesuai dengan batasan skema penomoran yang dilakukan oleh AssemblyVersion (<build> <65K, misalnya). Itu bisa 3.2. <Rilis tag teks>. <datetime>, jika Anda suka. Sistem build Anda harus mengisi token.
Selain itu, itu tidak tunduk pada penggantian wildcard yang AssemblyVersion. Jika Anda hanya memiliki nilai "3.0.1. *" Di AssemblyInfo.cs, itulah yang akan ditampilkan di informasi Versi lain-> elemen Versi File.
3) Saya tidak tahu dampaknya pada installer menggunakan sesuatu selain nomor versi file numerik.
sumber
Ketika AssemblyVersion majelis diubah, Jika memiliki nama yang kuat, majelis referensi perlu dikompilasi ulang, jika tidak majelis tidak memuat! Jika tidak memiliki nama yang kuat, jika tidak secara eksplisit ditambahkan ke file proyek, itu tidak akan disalin ke direktori output ketika membangun sehingga Anda mungkin kehilangan bergantung majelis, terutama setelah membersihkan direktori output.
sumber