Montaj dosyasının sürümünü nasıl alabilirim


727

Gelen AssemblyInfoiki montaj versiyonu vardır:

  1. AssemblyVersion: İlişkilendirilen montajın sürümünü belirtin.
  2. AssemblyFileVersion: Derleyiciye Win32 dosya sürümü kaynağı için belirli bir sürüm numarası kullanma talimatı verir. Win32 dosya sürümünün derlemenin sürüm numarası ile aynı olması gerekmez.

Assembly VersionAşağıdaki kod satırı ile alabilirsiniz :

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

Ama bunu nasıl alabilirim Assembly File Version?


2
"Montaj sürümü" yerine "montaj dosyası sürümü" ile ne demek istiyorsun? Bir örnek verebilir misin?
— Xiaofu

7
@Xiaofu - .NET'in dahili olarak kullandığı "Montaj Sürümü". Bir dosyaya sağ tıklayıp "özellikler" ve ardından "ayrıntılar" sekmesine gittiğinizde "Montaj Dosyası Sürümü" gösterilir. Aynı değiller.
— rory.ap

Derleme sürümü AppData user.config konumunu belirlerken kullanılan ne olduğunu buldum.
— Kyle Delaney

Yanıtlar:


867

Gerçekten ne istediğinize dair açıklama isteyen yukarıdaki yorumuma bakın. Umarım budur:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fvi.FileVersion;

4
@Xiaofu: Sürüm numaralarını AssemblyInfo.cs dosyasından almanın herhangi bir yolu var mı?
— Markus

56
Bu kodla ilgili bir sorun, Derleme ve Revizyon numaralarını belirtmediyseniz aslında 1.0. *. * Döndürecektir. AssemblyName.GetAssemblyName (assembly.Location) .Version.ToString (); her iki sürümü de aynı şekilde ayarlıyorsanız size 'derlenmiş' sürüm numarasını (FileVersion ile aynı olması gerekir) getirir.
— Doguhan Uluca

17
@DoguhanUluca Onlar iki farklı şey. Bu size dosya sürümünü değil montaj sürümünü verecektir. "Her iki sürümü de aynı şekilde ayarlıyorsanız" bir çözüm değil, bir çözümdür.
— Nyerguds

1
FileVersionInfoSadece stringözellikleri var mı , özellikleri yok Versionmu?
— Kyle Delaney

3
@Yitzchak: Assembly.GetEntryAssembly()örneğin Office Eklentileri bağlamında ve diğer birçok durumda NULL döndürür. Ayrıca, eklentiler / eklentiler hakkında düşünürseniz - EntryAssembly ana bilgisayar uygulamasıdır ve çoğu zaman YourCode ™ sürümünüzü istersiniz :) Bunun yanı sıra, cevapta assembly.Locationkullanılan bu cevaba da null olabilir (yani ilk rastgele vaka googled: github.com/Azure/azure-functions-host/issues/1233 ) ve bu büyük olasılıkla null giriş derlemesinden daha sık gerçekleşir.
— quetzalcoatl

209

Orada üç sürümü : montaj , dosya ve ürün . Farklı özellikler tarafından kullanılırlar ve bunları açıkça belirtmezseniz farklı varsayılan değerleri alırlar.

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;

17
Bu blog yazısı bir gün kaybolduğunda, burada referans için kaynatılmıştır: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
Bunları AssemblyInfo.cs dosyasında belirtmek isteyenler için, assemblyVersion kullanımı için (istediğiniz sayılarla) === [assembly: AssemblyVersion("2.0.*")]fileVersion kullanımı === [assembly: AssemblyFileVersion("2.0.*")]ve productVersion kullanımı === [assembly: AssemblyInformationalVersion("2.0.*")] Sonuncusu SemVeruyumluluk için dize soneki alabilir :[assembly: AssemblyInformationalVersion("2.0.0-alpha")]
— Jesse Chisholm

Zeyilname: son ek gösterimini AssemblyFileVersionkullanamazsınız *. :( Dört sayıya da ihtiyacı var.[assembly: AssemblyFileVersion("2.0.0.1")]
— Jesse Chisholm

67

Uygulama dosyası sürümüne (Derleme Bilgileri -> Dosya sürümünde ayarlanan) erişmek istediğimde, sürümü görüntülemek için form yükünde bir etiketin metnini ayarlamayı söyleyin, yeni kullandım

versionlabel.Text = "Version " + Application.ProductVersion;

53
Bunun System.Windows.Forms için bir başvuru gerektirdiğini ve bu nedenle tüm uygulamalar için uygun olmayabileceğini unutmayın.
— BradleyDotNET

2
Ne yazık ki, bu bir dize. Kendinizi daha basit bir "v1.08" biçiminde biçimlendirmek istiyorsanız ideal değildir. Alt bileşenleri tamsayı olarak almak için sürüm nesnesini alırsanız çok daha kullanışlı.
— Nyerguds

1
Ayrıca, AssemblyVersion değil, AssemblyInfo'dan AssemblyFileVersion'ı alır, bu yüzden dikkat edin
— dario_ramos

Yüksek düzeyde bir kullanıcı, bunun yalnızca Windows Forms için olduğunu daha açık hale getirmek için bu yanıtı düzenleyebilir mi?
— jrh

Aradığım şey tam olarak bu, cevap için teşekkürler!
— David Refoua

23

GÜNCELLEME: Alıntı yaptığım yazı , @Iain ve @Dmitry Lobanov'da Richard Grimes tarafından belirtildiği gibi , cevabım teoride doğru fakat pratikte yanlış.

Sayısız kitaptan vb. Hatırladığım gibi, biri bu özellikleri kullanarak ayarlarken [assembly: XXXAttribute], derleyici tarafından highjacked edilir ve VERSIONINFOkaynağa yerleştirilir .

Yukarıdaki nedenden dolayı, @ Xiaofu'nun cevabındaki yaklaşımı kullanmanız gerekir , çünkü özellikler onlardan sinyal çıkarıldıktan sonra sıyrılır.


genel statik dize GetProductVersion ()
{
  var attribute = (AssemblyVersionAttribute) Derleme
    .GetExecutingAssembly ()
    .GetCustomAttributes (typeof (AssemblyVersionAttribute), true).
    .Tek();
   return niteliği.InformationalVersion;
}

( Http://bytes.com/groups/net/420417-assemblyversionattribute adresinden - burada belirtildiği gibi, farklı bir özellik arıyorsanız, bunu yukarıdaki ile değiştirin)


Hey Ruben, 2 not. İlk olarak, soru AssemblyVersion değil AssemblyFileVersion istedi. İkinci olarak, Assembly.GetExecutingAssembly (). GetCustomAttributes (typeof (AssemblyVersionAttribute), true) uzunluk 0 dizisini döndürür. Bunun nedeni AssemblyVersionAttribute özel bir öznitelik olmadığından kaynaklanmaktadır.
— Iain

İlk noktaya, bu yüzden dedim ki "farklı bir özellik için lookign iseniz, yukarıdaki yerine koyun" (IIRC ben denemedim). İkinci olarak, bu makul görünüyor ama kazmak için zaman yok ...
— Ruben Bartelink

Evet, aslında .GetCustomAttribute () ile AssemblyVersion özniteliğini alamazsınız, derleme sürümü AssemblyName.Versionyalnızca özellik üzerinden alınabilir . Ancak diğer tüm özelliklerle bunu yapmanın doğru yolu
— Dmitrii Lobanov

@DmitryLobanov ve Iain Bilgi istemleri için teşekkürler. Umarım düzenleme, cevabı silmek yerine tutmaya değer hale getirir - bana bildirin!
— Ruben Bartelink

1
Kullandığım AssemblyInformationalVersionAttributeyerine AssemblyVersionAttribute.net çekirdek 3.1
— Vasya Milovidov

5

Bunu kullan:

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

Veya bu:

new Version(System.Windows.Forms.Application.ProductVersion);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.