Програмно отримати номер версії DLL


151

Чи можна отримати номер версії програмно з будь-якої .NET DLL?

Якщо так, то як?


10
Не можу повірити, що це запитали 6 хвилин тому, збирався запитати те саме!
tpower

2
ознайомтесь і з цим посиланням на версію для автоматичного збільшення - blog.mbcharbonneau.com/2007/03/13/…
JL

Відповіді:


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

Важливо: Слід зазначити, що це не найкраща відповідь на початкове запитання. Не забудьте прочитати більше на цій сторінці.


28
Це завантажує MyAssembly.dll у запущений AppDomain ... погана ідея.
staafl

12
Рекомендую Assemblyname.GetAssemblyNameуникати цих питань
staafl

7
завантаження збірки в додаток є повільним, незворотним (ви не можете його розвантажити, не вбиваючи домен), вимагає дозволів і може викликати побічні ефекти, такі як виконання beforefieldinitініціалізаторів типу, і просто не потрібно в цьому випадку. Ці причини досить звучать?
staafl

7
@staafl: Так; не тільки для мене, але і для всіх, хто читає цю сторінку в майбутньому.
Kris

6
FileVersionInfo.GetVersionInfo("foo.dll").FileVersionдобре виконує роботу і не завантажує dll у додаток.
Джек

181

Це працює, якщо dll є .net або Win32 . Методи відображення працюють лише у випадку, коли dll є .net. Крім того, якщо ви використовуєте відображення, у вас є накладні витрати на завантаження всього dll в пам'ять. Наведений нижче метод не завантажує збірку в пам'ять.

// 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);

Від: http://msdn.microsoft.com/en-us/library/system.diagnostics.fileversioninfo.fileversion.aspx

першоджерело


5
Мені подобається це. Чому б вам не доводилося завантажувати dll, а потім використовувати роздуми просто для отримання версії, коли все, що ви насправді хочете зробити, це це ???
aggieNick02

@ben, ви могли б відредагувати публікацію? Я побачив, що втратив -1 реп. Від додавання поточного голосу, що не пам'ятаю. це не дозволить мені змінити його, якщо ви не редагуєте публікацію. ура!
Люк Даддрідж

9
Якщо ви хочете , щоб переконатися , що ви отримаєте виконуваний / DLL фактично використовується в даний момент: замість статичного файлу ( @"C:\MyAssembly.dll"вище), ви можете використовувати System.Reflection.Assembly.GetExecutingAssembly().Location(або , якщо в DLL: Assembly.GetAssembly(typeof(AClassInTheDll)).Location)
Конрад

4
Це різниця між атрибутами AssemblyVersion і AssemblyFileVersion. AssemblyFileVersion отримує печатку таким чином, як API API може отримати значення. AssemblyVersion є частиною сильної назви, але не обов'язково є тим самим, що і AssemblyFileVersion.
daughey

51

Перш за все, є дві можливі "версії", які можуть вас зацікавити:

  • Версія файлової системи Windows, застосовна до всіх виконуваних файлів

  • Версія складання збірки, яка вбудована у збірку .NET компілятором (очевидно, стосується лише файлів dll і exe збірки .NET)

У першому випадку вам слід скористатися відповіддю Бена Андерсона; в останньому випадку використовуйте AssemblyName.GetAssemblyName(@"c:\path\to\file.dll").Versionабо відповідь Татаро, якщо на збірку посилається ваш код.

Зауважте, що ви можете ігнорувати всі відповіді, які використовують .Load()/ .LoadFrom()методи, оскільки вони фактично завантажують збірку в поточному AppDomain - що аналогічно вирубці дерева, щоб побачити, скільки йому років.


32

Ось приємний спосіб за допомогою трохи роздумів отримати версію DLL, що містить певний клас:

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

Просто замініть! Клас! з назвою класу, визначеного в DLL, для якого потрібно отримати версію.

Це мій кращий метод, тому що якщо я переміщую DLL навколо різних пристроїв, мені не доведеться змінювати шлях файлу.


3
Зауважте, що це працює лише в тому випадку, якщо на відповідну збірку статично посилається поточна.
staafl

2
Це найкраща відповідь, оскільки DLL - це не обов'язково вступна збірка, навіть не збірка, з якої вона називається
CAD блокувати

1
Див. Stackoverflow.com/a/909583/492 для отримання інформації про різні типи версій. наприкладFileVersionInfo
CAD блокується

22

Щоб отримати його для збірки, яку розпочали (winform, консольний додаток тощо)

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

6
GetExecutingAssembly () також може допомогти.
Болт Грім

10

Kris, ваша версія відмінно працює, коли потрібно завантажити збірку з фактичного файлу DLL (і якщо DLL є!), Однак, якщо DLL ВИМКНЕНО (тобто не файл, а вбудований файл), ви отримаєте набагато небажану помилку. DLL).

Інша справа, якщо ви використовуєте схему версій з чимось на зразок " 1.2012.0508.0101 ", коли ви отримуєте рядок версії, ви фактично отримаєте " 1.2012.518.101 "; відзначте відсутні нулі .

Отже, ось кілька додаткових функцій для отримання версії DLL (вбудованої або з файлу DLL):

    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

Відповідь @Ben виявилася для мене корисною. Але мені потрібно було перевірити версію продукту, оскільки це було головним збільшенням мого програмного забезпечення та послідовної семантичної версії.

myFileVersionInfo.ProductVersion

Цей метод виправдав мої сподівання

Оновлення: Замість того, щоб явно згадати шлях до dll у програмі (за потреби у виробничій версії), ми можемо отримати версію продукту, використовуючи Assembly.

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

Примітка: якщо версія містить зірочку для автоматичного збільшення значення, цей метод поверне зірочку замість фактично створеного числа (тобто не працює, якщо ви введете 1.0. * В інформацію про збірку).
Ронен Несс

Так! Однак я вибрав автоматизацію Jeniks для оновлення версії, тому збірка завжди має ідеальну комбінацію версії dll.
Прасан Датт

1

Ви можете використовувати System.Reflection.Assembly.Load * () методи, а потім захопити їх AssemblyInfo.


0

Хоча оригінальний запитання, можливо, не було специфічним для веб-сервісу, ось повний testWebService, який ви можете додати, щоб відобразити некешований відповідь веб-служби плюс версію файлу. Ми використовуємо версію файлу замість монтажної версії, тому що ми хочемо знати версію, але з усіма версіями версії 1.0.0.0 веб-сайт може бути легко зафіксований (посилання для підписання та вимоги все ще активне!) Замініть @ Class @ на ім'я веб-контролера api, до якого вбудована ця послуга. Це добре для переходу на веб-сервіс go / nogo та швидкої перевірки версії.

  [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;
  }

Я також вважав за необхідне додати наступне до web.config під конфігурацією, щоб зробити його справді анонімним

<location path="api/testwebservice">
    <system.web>
        <authorization>
            <allow users="*" />
        </authorization>
    </system.web>
</location>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.