Programlı olarak bir DLL sürüm numarasını alın


151

Sürüm numarasını programlı olarak herhangi bir .NET DLL'den almak mümkün mü?

Evet ise, nasıl?


10
Bu 6 dakika önce istendi inanamıyorum, hemen hemen aynı sormak oldu!
tpower

2
otomatik artan sürüm için de bu bağlantıyı kontrol edin - blog.mbcharbonneau.com/2007/03/13/…
JL.

Yanıtlar:


119
Assembly assembly = Assembly.LoadFrom("MyAssembly.dll");
Version ver = assembly.GetName().Version;

Önemli: Bunun orijinal sorunun en iyi cevabı olmadığı belirtilmelidir. Bu sayfada daha fazlasını okumayı unutmayın.


28
Bu, çalışan AppDomain ... kötü fikir MyAssembly.dll yükler.
staafl

12
Assemblyname.GetAssemblyNameBu sorunlardan kaçınmanızı öneririm
staafl

7
bir montajı uygulama alanına yüklemek yavaş, geri döndürülemez (etki alanını öldürmeden yükleyemezsiniz), izinler gerektirir ve beforefieldinittür başlatıcıları yürütme gibi yan etkilere neden olabilir ve bu durumda gerekli değildir. Bu nedenler yeterli mi?
staafl

7
@staafl: Evet; sadece benim için değil, gelecekte bu sayfayı okuyan herkes için de.
Kris

6
FileVersionInfo.GetVersionInfo("foo.dll").FileVersionişi iyi yapar ve uygulama içine dll yüklemez.
Jack

181

Bu dll .net veya Win32 ise çalışır . Yansıma yöntemleri sadece dll .net ise çalışır. Ayrıca, yansıma kullanırsanız, belleğe tüm dll yükleme yükü var. Aşağıdaki yöntem, düzeneği belleğe yüklemez.

// Get the file version.
FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo(@"C:\MyAssembly.dll");

// Print the file name and version number.
Console.WriteLine("File: " + myFileVersionInfo.FileDescription + '\n' +
                  "Version number: " + myFileVersionInfo.FileVersion);

Gönderen: http://msdn.microsoft.com/en-us/library/system.diagnostics.fileversioninfo.fileversion.aspx

orjinal kaynak


5
Bunu severim. Neden dll yükleme rahatsız ve daha sonra sadece tüm yapmak istediğiniz bu, sadece sürümünü almak için yansıma kullanın ??
aggieNick02

@ben, yayını düzenleyebilir misiniz? Yaptığım hatırlamıyorum, bir aşağı oy ekleyerek -1 temsilcisi kaybettiğini gördüm. Gönderiyi düzenlemediğiniz sürece değiştirmeme izin vermeyecek. şerefe!
Luke Duddridge

9
Yapmak isterseniz emin olsun yürütülebilir / dll aslında şu anda kullanımda: yerine statik bir dosya adı (ve @"C:\MyAssembly.dll"üzeri), kullanabilirsiniz System.Reflection.Assembly.GetExecutingAssembly().Location(ya da dll eğer: Assembly.GetAssembly(typeof(AClassInTheDll)).Location)
Conrad

4
AssemblyVersion ve AssemblyFileVersion öznitelikleri arasındaki farktır. AssemblyFileVersion, Windows API'nın değeri alabileceği şekilde damgalanır. AssemblyVersion, güçlü adın bir parçasıdır ve AssemblyFileVersion ile aynı olmak zorunda değildir.
daughey

51

Her şeyden önce, ilginizi çekebilecek iki olası 'sürüm' vardır:

  • Tüm yürütülebilir dosyalara uygulanabilen Windows dosya sistemi dosya sürümü

  • Derleyici tarafından bir .NET derlemesine gömülü derleme derleme sürümü (açıkçası yalnızca .NET derlemesi dll ve exe dosyaları için geçerlidir)

Önceki durumda, Ben Anderson'ın cevabını kullanmalısınız; ikinci durumda AssemblyName.GetAssemblyName(@"c:\path\to\file.dll").Versionderlemeye kodunuz tarafından başvurulması durumunda kullanın veya Tataro'nun yanıtını kullanın .

.Load()/ .LoadFrom()Yöntemi kullanan tüm yanıtları göz ardı edebileceğinizi unutmayın , çünkü bunlar gerçekte montajı mevcut AppDomain'e yükler - ki bu kaç yaşında olduğunu görmek için bir ağacı kesmeye benzer.


32

İşte belirli bir sınıfı içeren bir DLL sürümünü almak için biraz yansıma kullanmanın güzel bir yolu:

var ver = System.Reflection.Assembly.GetAssembly(typeof(!Class!)).GetName().Version;

Sadece değiştirin! sürümünü almak istediğiniz DLL'de tanımlanan bir sınıfın adı ile.

Bu benim tercih edilen yöntemdir çünkü farklı dağıtımlar için DLL'leri hareket ettirirsem dosya yolunu değiştirmek zorunda değilim.


3
Bu işlemin yalnızca söz konusu derlemeye geçerli olarak statik olarak başvurulması durumunda işe yaradığını unutmayın.
staafl

2
DLL en iyi yanıt budur çünkü bu bile denir derleme bile giriş derleme değildir
CAD bloke

1
Farklı sürüm bilgisi türleri için stackoverflow.com/a/909583/492 adresine bakın . ör.FileVersionInfo
CAD bloke

22

Başlatılan montajı almak için (winform, konsol uygulaması vb.)

using System.Reflection;
...
Assembly.GetEntryAssembly().GetName().Version

6
GetExecutingAssembly () de yardımcı olabilir.
Bolt Thunder

10

Kris, sürümün derleme gerçek DLL dosyasından yüklenmesi gerektiğinde harika çalışıyor (ve DLL varsa!), Ancak DLL EMBEDDED ise (yani, bir dosya değil, gömülü ise çok istenmeyen bir hata alırsınız) DLL).

Diğer bir şey, eğer biri " 1.2012.0508.0101 " gibi bir sürümleme şeması kullanırsa , sürüm dizesini aldığında aslında " 1.2012.518.101 " alırsınız ; eksik sıfırlara dikkat edin .

Yani, burada bir DLL (gömülü veya DLL dosyasından) sürümünü almak için birkaç ekstra işlev:

    public static System.Reflection.Assembly GetAssembly(string pAssemblyName)
    {
        System.Reflection.Assembly tMyAssembly = null;

        if (string.IsNullOrEmpty(pAssemblyName)) { return tMyAssembly; }
        tMyAssembly = GetAssemblyEmbedded(pAssemblyName);
        if (tMyAssembly == null) { GetAssemblyDLL(pAssemblyName); }

        return tMyAssembly;
    }//System.Reflection.Assembly GetAssemblyEmbedded(string pAssemblyDisplayName)


    public static System.Reflection.Assembly GetAssemblyEmbedded(string pAssemblyDisplayName)
    {
        System.Reflection.Assembly tMyAssembly = null;

        if(string.IsNullOrEmpty(pAssemblyDisplayName)) { return tMyAssembly; }
        try //try #a
        {
            tMyAssembly = System.Reflection.Assembly.Load(pAssemblyDisplayName);
        }// try #a
        catch (Exception ex)
        {
            string m = ex.Message;
        }// try #a
        return tMyAssembly;
    }//System.Reflection.Assembly GetAssemblyEmbedded(string pAssemblyDisplayName)


    public static System.Reflection.Assembly GetAssemblyDLL(string pAssemblyNameDLL)
    {
        System.Reflection.Assembly tMyAssembly = null;

        if (string.IsNullOrEmpty(pAssemblyNameDLL)) { return tMyAssembly; }
        try //try #a
        {
            if (!pAssemblyNameDLL.ToLower().EndsWith(".dll")) { pAssemblyNameDLL += ".dll"; }
            tMyAssembly = System.Reflection.Assembly.LoadFrom(pAssemblyNameDLL);
        }// try #a
        catch (Exception ex)
        {
            string m = ex.Message;
        }// try #a
        return tMyAssembly;
    }//System.Reflection.Assembly GetAssemblyFile(string pAssemblyNameDLL)


    public static string GetVersionStringFromAssembly(string pAssemblyDisplayName)
    {
        string tVersion = "Unknown";
        System.Reflection.Assembly tMyAssembly = null;

        tMyAssembly = GetAssembly(pAssemblyDisplayName);
        if (tMyAssembly == null) { return tVersion; }
        tVersion = GetVersionString(tMyAssembly.GetName().Version.ToString());
        return tVersion;
    }//string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName)


    public static string GetVersionString(Version pVersion)
    {
        string tVersion = "Unknown";
        if (pVersion == null) { return tVersion; }
        tVersion = GetVersionString(pVersion.ToString());
        return tVersion;
    }//string GetVersionString(Version pVersion)


    public static string GetVersionString(string pVersionString)
    {
        string tVersion = "Unknown";
        string[] aVersion;

        if (string.IsNullOrEmpty(pVersionString)) { return tVersion; }
        aVersion = pVersionString.Split('.');
        if (aVersion.Length > 0) { tVersion = aVersion[0]; }
        if (aVersion.Length > 1) { tVersion += "." + aVersion[1]; }
        if (aVersion.Length > 2) { tVersion += "." + aVersion[2].PadLeft(4, '0'); }
        if (aVersion.Length > 3) { tVersion += "." + aVersion[3].PadLeft(4, '0'); }

        return tVersion;
    }//string GetVersionString(Version pVersion)


    public static string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName)
    {
        string tVersion = "Unknown";
        System.Reflection.Assembly tMyAssembly = null;

        tMyAssembly = GetAssemblyEmbedded(pAssemblyDisplayName);
        if (tMyAssembly == null) { return tVersion; }
        tVersion = GetVersionString(tMyAssembly.GetName().Version.ToString());
        return tVersion;
    }//string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName)


    public static string GetVersionStringFromAssemblyDLL(string pAssemblyDisplayName)
    {
        string tVersion = "Unknown";
        System.Reflection.Assembly tMyAssembly = null;

        tMyAssembly = GetAssemblyDLL(pAssemblyDisplayName);
        if (tMyAssembly == null) { return tVersion; }
        tVersion = GetVersionString(tMyAssembly.GetName().Version.ToString());
        return tVersion;
    }//string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName)

2
var versionAttrib = new AssemblyName(Assembly.GetExecutingAssembly().FullName);

2

@Ben tarafından verilen cevap benim için yararlı oldu. Ancak yazılımımda meydana gelen ana artış olduğu için ürün sürümünü kontrol etmem gerekiyordu ve anlamsal sürümlemeyi izledim.

myFileVersionInfo.ProductVersion

Bu yöntem beklentilerimi karşıladı

Güncelleme: Programda açıkça dll yolundan bahsetmek yerine (üretim versiyonunda gerektiği gibi), Montaj'ı kullanarak ürün sürümünü alabiliriz.

Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fileVersionInfo =FileVersionInfo.GetVersionInfo(assembly.Location); 
string ProdVersion= fileVersionInfo.ProductVersion;

Not: Sürüm, otomatik olarak artırılan değer için yıldız işareti içeriyorsa, bu yöntem gerçek oluşturulan sayı yerine yıldız işareti döndürür (yani montaj bilgilerinize 1.0. * Koyarsanız çalışmaz).
Ronen Ness

Evet! Ancak, montaj her zaman dll sürümünün mükemmel bir kombinasyona sahip olması nedeniyle sürüm yükseltme için Jeniks otomasyonunu seçtim.
Prasan Dutt

1

System.Reflection.Assembly.Load * () yöntemlerini kullanabilir ve sonra AssemblyInfo'larını alabilirsiniz.


0

Orijinal soru bir web hizmetine özgü olmayabilir, ancak burada bir web hizmeti önbelleğe alınmamış yanıtı artı dosya sürümünü görüntülemek için ekleyebileceğiniz tam bir testWebService. Bir sürüm bilmek istediğimiz için montaj sürümü yerine dosya sürümünü kullanıyoruz, ancak tüm montaj sürümleri 1.0.0.0 ile web sitesi kolayca yamalanabilir (imzalama ve talep bağlantısı hala etkin!). @ Class @ yerine bu hizmetin katıldığı web api denetleyicisi adı ile değiştirin. Bir web hizmetindeki bir go / nogo ve hızlı sürüm kontrolü için iyidir.

  [Route("api/testWebService")]
  [AllowAnonymous]
  [HttpGet]
  public HttpResponseMessage TestWebService()
  {
      HttpResponseMessage responseMessage = Request.CreateResponse(HttpStatusCode.OK);
      string loc = Assembly.GetAssembly(typeof(@Class@)).Location;
      FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(loc);
      responseMessage.Content = new StringContent($"<h2>The XXXXX web service GET test succeeded.</h2>{DateTime.Now}<br/><br/>File Version: {versionInfo.FileVersion}");
      responseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
      Request.RegisterForDispose(responseMessage);
      return responseMessage;
  }

Ben de gerçekten anonim yapmak için yapılandırma altında web.config eklemek için gerekli buldum

<location path="api/testwebservice">
    <system.web>
        <authorization>
            <allow users="*" />
        </authorization>
    </system.web>
</location>
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.