Возможно ли получить номер версии программно из любой .NET DLL?
Если да, то как?
Возможно ли получить номер версии программно из любой .NET DLL?
Если да, то как?
Assembly assembly = Assembly.LoadFrom("MyAssembly.dll");
Version ver = assembly.GetName().Version;
Важно: Следует отметить, что это не лучший ответ на исходный вопрос. Не забудьте прочитать больше на этой странице.
Это работает, если 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
Прежде всего, есть две возможные "версии", которые могут вас заинтересовать:
Версия файла файловой системы Windows, применимая ко всем исполняемым файлам
Сборка сборки, встроенная в сборку .NET компилятором (очевидно, применима только к сборке DLL и EXE файлам .NET)
В первом случае вы должны использовать ответ Бен Андерсона; в последнем случае используйте AssemblyName.GetAssemblyName(@"c:\path\to\file.dll").Version
или ответ Tataro, если на ваш сайт ссылается ваш код.
Обратите внимание, что вы можете игнорировать все ответы, которые используют методы .Load()
/.LoadFrom()
, так как они фактически загружают сборку в текущем AppDomain, что аналогично сокращению дерева, чтобы узнать, сколько ему лет.
Чтобы получить его для сборки, которая была запущена (winform, консольное приложение и т.д.)
using System.Reflection;
...
Assembly.GetEntryAssembly().GetName().Version
Вот хороший способ, используя немного отражения, чтобы получить версию DLL, содержащую определенный класс:
var ver = System.Reflection.Assembly.GetAssembly(typeof(!Class!)).GetName().Version;
Просто замените! Класс! с именем класса, который определен в DLL, вы хотите получить версию.
Это мой предпочтительный метод, потому что, если я перемещаю библиотеки DLL для разных развертываний, мне не нужно менять путь к файлу.
Крис, ваша версия отлично работает, когда вам нужно загрузить сборку из фактического файла DLL (и если есть DLL!), однако, вы получите много нежелательной ошибки, если DLL является EMBEDDED (т.е. не файл но встроенная 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)
Вы можете использовать методы System.Reflection.Assembly.Load *(), а затем захватить их AssemblyInfo.
var versionAttrib = new AssemblyName(Assembly.GetExecutingAssembly().FullName);