以编程方式获取DLL的版本号
Assembly assembly = Assembly.LoadFrom("MyAssembly.dll");
Version ver = assembly.GetName().Version;
重要: 应当指出的是,这是不是最好的答案,原来的问题。不要忘记在此页面上阅读更多内容。
这会将MyAssembly.dll加载到正在运行的AppDomain中......坏主意。 – staafl 2013-10-10 13:03:38
@staafl:我觉得这很可能是OP想要的。如果没有,还有“Assembly.ReflectionOnlyLoadFrom”请参阅http://msdn.microsoft.com/en-us/library/system.reflection.assembly.reflectiononlyloadfrom.aspx – Kris 2013-10-10 13:36:08
我不相信OP以任何方式暗示它。此外,ReflectionOnlyLoadFrom还有其自身的副作用 - “仅反射上下文与其他上下文没有区别,加载到上下文中的程序集只能通过卸载应用程序域来卸载。” – staafl 2013-10-10 13:49:43
您可以使用System.Reflection.Assembly.Load *()方法,然后获取其AssemblyInfo。
为了得到它而启动的组件(WinForm的,控制台应用程序等等)
using System.Reflection;
...
Assembly.GetEntryAssembly().GetName().Version
GetExecutingAssembly()也可能有所帮助。 – 2013-05-27 08:57:24
克里斯,你的版本需要加载从实际的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)
var versionAttrib = new AssemblyName(Assembly.GetExecutingAssembly().FullName);
下面是一个使用位反射得到一个版本的好方法包含特定类的DLL:
var ver = System.Reflection.Assembly.GetAssembly(typeof(!Class!)).GetName().Version;
只需更换!Class!用您希望获取版本的DLL中定义的类的名称。
这是我首选的方法,因为如果我为不同的部署移动DLL,我不必更改文件路径。
请注意,这仅适用于所讨论的程序集是由当前程序静态引用的问题。 – staafl 2013-10-10 13:02:39
这是最好的答案,因为DLL不一定是入口程序集,甚至不是从 – 2017-10-22 23:46:59
调用的程序集,请参阅https://stackoverflow.com/a/909583/492以获取不同类型的版本信息。例如'FileVersionInfo' – 2017-10-23 00:20:06
如果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
我喜欢这个。为什么你会打扰加载DLL,然后使用反射来获取版本,当你真正想要做的是这个? – aggieNick02 2013-02-25 17:19:03
+1非常好,正是我需要的。 – 2013-06-25 15:13:15
@ben,你可以编辑帖子吗?我看到我失去了-1代表加入downvote,我不记得做。它不会让我改变它,除非你编辑帖子。干杯! – 2014-08-21 09:35:32
首先,有两种可能的 '版本',你可能有兴趣
的Windows文件系统文件的版本,适用到所有可执行文件
程序集构建版本,由编译器嵌入到.NET程序集中(显然只适用于。NET程序集DLL和EXE文件)
在前一种情况下,你应该使用本安德森的答案;在后一种情况下,请使用AssemblyName.GetAssemblyName(@"c:\path\to\file.dll").Version
或Tataro的答案,以防程序集引用该程序集。
请注意,您可以忽略使用.Load()
/.LoadFrom()
方法的所有答案,因为这些方法实际上将程序集加载到当前的AppDomain中 - 这与裁减树来查看它的年龄有些类似。
+1这是比我的更优的答案。 – Kris 2013-10-11 12:40:27
不能相信这是问了6分钟前,正要问同样的! – tpower 2009-11-18 12:03:24
哈哈 - 为我工作... – 2009-11-18 12:50:26
查看这个链接也为自动递增版本 - http://blog.mbcharbonneau.com/2007/03/13/auto-incrementing-build-numbers-in-visual-studio/ – 2009-11-18 12:50:57