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.