Bagaimana saya bisa mendapatkan versi file perakitan

727

Di AssemblyInfoada dua versi perakitan:

  1. AssemblyVersion: Tentukan versi perakitan yang dikaitkan.
  2. AssemblyFileVersion: Menginstruksikan kompiler untuk menggunakan nomor versi spesifik untuk sumber daya versi file Win32. Versi file Win32 tidak harus sama dengan nomor versi majelis.

Saya bisa mendapatkan Assembly Versiondengan baris kode berikut:

Version version = Assembly.GetEntryAssembly().GetName().Version;

Tapi bagaimana saya bisa mendapatkannya Assembly File Version?

Enyra
sumber
2
Apa yang Anda maksud dengan "versi file rakitan" sebagai kebalikan dari "versi rakitan"? Bisakah Anda memberi contoh?
Xiaofu
7
@Xiaofu - "Versi Perakitan" adalah yang digunakan oleh .NET secara internal. "Assembly File Version" adalah apa yang ditampilkan ketika Anda mengklik kanan pada sebuah file dan pergi ke "properties" lalu tab "details". Mereka tidak sama.
rory.ap
Saya telah menemukan bahwa versi perakitan adalah apa yang digunakan ketika menentukan lokasi user.config di AppData.
Kyle Delaney

Jawaban:

867

Lihat komentar saya di atas untuk meminta klarifikasi tentang apa yang sebenarnya Anda inginkan. Semoga ini dia:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fvi.FileVersion;
Xiaofu
sumber
4
@Xiaofu: Apakah ada cara untuk mendapatkan nomor versi dari file AssemblyInfo.cs?
Markus
56
Satu masalah dengan kode ini adalah bahwa, itu benar-benar akan mengembalikan 1.0. *. * Jika Anda belum menentukan angka Build dan Revisi. AssemblyName.GetAssemblyName (assembly.Location) .Version.ToString (); akan memberi Anda nomor versi 'yang dikompilasi' - yang harus sama dengan FileVersion, jika Anda mengatur kedua versi dengan cara yang sama.
Doguhan Uluca
17
@DoguhanUluca Mereka adalah dua hal yang berbeda. Itu akan memberi Anda versi perakitan, bukan versi file. "Jika Anda mengatur kedua versi dengan cara yang sama" adalah solusi, bukan solusi.
Nyerguds
1
Apakah FileVersionInfohanya memiliki stringproperti dan tidak ada Versionproperti?
Kyle Delaney
3
@Yitzchak: Assembly.GetEntryAssembly()mengembalikan NULL misalnya dalam konteks Add-in Office, dan juga dalam banyak kasus lainnya. Juga, jika Anda berpikir tentang addins / plugins - EntryAssembly adalah aplikasi host, dan paling sering Anda menginginkan versi YourCode (TM) :) Selain itu, ada baiknya menambahkan jawaban ini yang assembly.Locationdigunakan dalam jawaban yang bisa nol juga. (yaitu case acak pertama yang googledout : github.com/Azure/azure-functions-host/issues/1233 ) dan itu mungkin terjadi bahkan lebih sering daripada memiliki null entry-assembly.
quetzalcoatl
209

Ada tiga versi : perakitan , file , dan produk . Mereka digunakan oleh fitur yang berbeda dan mengambil nilai default yang berbeda jika Anda tidak menentukannya secara eksplisit.

string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); 
string assemblyVersion = Assembly.LoadFile("your assembly file").GetName().Version.ToString(); 
string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; 
string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;
Pemeriksaan6
sumber
17
Karena ketika posting blog itu hilang suatu hari, ini dia direbus untuk referensi:string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); string assemblyVersion = Assembly.LoadFile('your assembly file').GetName().Version.ToString(); string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;
JMD
3
Dan bagi mereka yang ingin menentukan ini dalam file AssemblyInfo.cs, untuk penggunaan assemblyVersion (dengan angka apa pun yang Anda inginkan) === [assembly: AssemblyVersion("2.0.*")]untuk penggunaan fileVersion === [assembly: AssemblyFileVersion("2.0.*")]dan untuk productVersion gunakan === [assembly: AssemblyInformationalVersion("2.0.*")] Yang terakhir mungkin menggunakan sufiks string untuk SemVerkompatibilitas:[assembly: AssemblyInformationalVersion("2.0.0-alpha")]
Jesse Chisholm
Tambahan: AssemblyFileVersiontidak boleh menggunakan *notasi suffix. :( Perlu keempat angka.[assembly: AssemblyFileVersion("2.0.0.1")]
Jesse Chisholm
66

Ketika saya ingin mengakses versi file aplikasi (apa yang diatur dalam Informasi Perakitan -> Versi file), katakan untuk mengatur teks label untuk itu pada formulir memuat untuk menampilkan versi, saya baru saja menggunakan

versionlabel.Text = "Version " + Application.ProductVersion;
sintaksis
sumber
53
Perhatikan bahwa ini memerlukan referensi ke System.Windows.Forms, dan mungkin tidak cocok untuk semua aplikasi.
BradleyDotNET
2
Sayangnya, itu sebuah string. Tidak ideal jika Anda ingin memformatnya sendiri ke jenis format "v1.08" yang lebih sederhana. Jauh lebih mudah jika Anda benar-benar mendapatkan objek versi untuk mendapatkan sub-komponen dari sebagai bilangan bulat.
Nyerguds
1
Juga, ini mengambil AssemblyFileVersion dari AssemblyInfo, bukan AssemblyVersion, jadi hati-hati
dario_ramos
Bisakah seorang pengguna tinggi mengedit jawaban ini untuk membuatnya lebih jelas bahwa ini hanya untuk Formulir Windows?
jrh
Ini persis apa yang saya cari, terima kasih atas jawabannya!
David Refoua
23

UPDATE: Seperti yang disebutkan oleh Richard Grimes dalam posting saya yang dikutip , @Iain dan @Dryry Lobanov, jawaban saya benar dalam teori tetapi salah dalam praktiknya.

Seperti yang seharusnya saya ingat dari banyak buku, dll., Sementara satu set properti ini menggunakan [assembly: XXXAttribute], mereka mendapatkan serangan oleh kompiler dan ditempatkan ke VERSIONINFOsumber daya.

Untuk alasan di atas, Anda perlu menggunakan pendekatan dalam jawaban @ Xiaofu ketika atribut dilucuti setelah sinyal telah diekstraksi dari mereka.


string statis publik GetProductVersion ()
{
  var attribute = (AssemblyVersionAttribute) Majelis
    .GetExecutingAssembly ()
    .GetCustomAttributes (typeof (AssemblyVersionAttribute), true)
    .Tunggal();
   mengembalikan atribut.InformationalVersion;
}

(Dari http://bytes.com/groups/net/420417-assemblyversionattribute - seperti disebutkan di sana, jika Anda mencari atribut yang berbeda, gantikan dengan yang di atas)

Ruben Bartelink
sumber
Hai Ruben, 2 catatan. Pertama, pertanyaan yang diajukan untuk AssemblyFileVersion bukan AssemblyVersion. Kedua, Assembly.GetExecutingAssembly (). GetCustomAttributes (typeof (AssemblyVersionAttribute), true) mengembalikan array dengan panjang 0. Saya pikir ini karena AssemblyVersionAttribute bukan atribut khusus.
Iain
Kembali ke poin pertama, itulah sebabnya saya berkata "jika Anda mencari atribut yang berbeda, gantikan dengan yang di atas" (IIRC saya tidak mencobanya). Re kedua, yang tampaknya masuk akal tapi tidak punya waktu untuk menggali di ...
Ruben Bartelink
Ya, Anda sebenarnya tidak bisa mendapatkan atribut AssemblyVersion melalui .GetCustomAttribute (), versi perakitan dapat diambil melalui AssemblyName.Versionproperti saja. Tetapi dengan setiap atribut lainnya itu adalah cara yang tepat untuk melakukannya
Dmitrii Lobanov
@DmitryLobanov dan Iain Terima kasih atas petunjuknya. Saya harap hasil edit mencakupnya dengan cukup untuk membuat jawabannya layak dijaga daripada dihapus - beri tahu saya!
Ruben Bartelink
1
Saya menggunakan AssemblyInformationalVersionAttributesebagai ganti AssemblyVersionAttributepada .net core 3.1
Vasya Milovidov
5

Gunakan ini:

((AssemblyFileVersionAttribute)Attribute.GetCustomAttribute(
    Assembly.GetExecutingAssembly(), 
    typeof(AssemblyFileVersionAttribute), false)
).Version;

Atau ini:

new Version(System.Windows.Forms.Application.ProductVersion);
Pieter Geerkens
sumber