Программно получить номер версии DLL - PullRequest
138 голосов
/ 18 ноября 2009

Можно ли программно получить номер версии из любой библиотеки .NET DLL?

Если да, то как?

Ответы [ 10 ]

164 голосов
/ 30 января 2013

Это работает, если dll .net или Win32 . Методы отражения работают только если dll .net. Кроме того, если вы используете отражение, у вас есть накладные расходы на загрузку всей DLL в память. Приведенный ниже метод не загружает сборку в память.

// Get the file version for the notepad.
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

оригинальный источник

108 голосов
/ 18 ноября 2009
Assembly assembly = Assembly.LoadFrom("MyAssembly.dll");
Version ver = assembly.GetName().Version;

Важно: Следует отметить, что это не лучший ответ на исходный вопрос. Не забудьте прочитать больше на этой странице.

47 голосов
/ 10 октября 2013

Прежде всего, есть две возможные «версии», которые могут вас заинтересовать:

  • Версия файла файловой системы Windows, применимая ко всем исполняемым файлам

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

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

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

25 голосов
/ 21 сентября 2012

Вот хороший способ использовать немного размышлений для получения версии DLL, содержащей определенный класс:

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

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

Это мой предпочтительный метод, потому что если я перемещаю библиотеки DLL для разных развертываний, мне не нужно менять путь к файлу.

22 голосов
/ 18 ноября 2009

Чтобы получить его для сборки, которая была запущена (winform, консольное приложение и т. Д.)

using System.Reflection;
...
Assembly.GetEntryAssembly().GetName().Version
8 голосов
/ 08 мая 2012

Крис, ваша версия отлично работает, когда нужно загрузить сборку из фактического файла 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 голосов
/ 19 июля 2012
var versionAttrib = new AssemblyName(Assembly.GetExecutingAssembly().FullName);
1 голос
/ 26 февраля 2019

Ответ @Ben оказался для меня полезным. Но мне нужно было проверить версию продукта, так как это было основным шагом в моем программном обеспечении и следовал за семантическим версионированием.

myFileVersionInfo.ProductVersion

Этот метод оправдал мои ожидания

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

Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fileVersionInfo =FileVersionInfo.GetVersionInfo(assembly.Location); 
string ProdVersion= fileVersionInfo.ProductVersion;
1 голос
/ 06 июня 2018

Хотя исходный вопрос, возможно, не относился к веб-службе, вот полный тестовый веб-сервис, который можно добавить для отображения не кэшированного ответа веб-службы плюс версия файла. Мы используем версию файла вместо версии сборки, потому что мы хотим знать версию, но со всеми версиями сборки 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>
1 голос
/ 18 ноября 2009

Вы можете использовать методы System.Reflection.Assembly.Load * (), а затем получить их AssemblyInfo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...