C# 以编程方式获取DLL的版本号
是否可以通过编程方式从任何.NET DLL获取版本号C# 以编程方式获取DLL的版本号,c#,.net,C#,.net,是否可以通过编程方式从任何.NET DLL获取版本号 如果是,如何使用?您可以使用System.Reflection.Assembly.Load*()方法,然后获取它们的AssemblyInfo Assembly assembly = Assembly.LoadFrom("MyAssembly.dll"); Version ver = assembly.GetName().Version; 重要提示: 应该指出的是,这并不是对原始问题的最佳答案。不要忘记阅读本页的更多内容。为已启动的程序集(w
如果是,如何使用?您可以使用System.Reflection.Assembly.Load*()方法,然后获取它们的AssemblyInfo
Assembly assembly = Assembly.LoadFrom("MyAssembly.dll");
Version ver = assembly.GetName().Version;
重要提示:
应该指出的是,这并不是对原始问题的最佳答案。不要忘记阅读本页的更多内容。为已启动的程序集(winform、console应用程序等)获取它
Kris,当需要从实际的DLL文件加载程序集时,您的版本工作得非常好(如果有DLL!),但是,如果嵌入了DLL(即不是文件而是嵌入的DLL),则会出现非常不必要的错误 另一件事是,如果使用类似“1.2012.0508.0101”的版本控制方案,当您获得版本字符串时,您将实际获得“1.2012.518.101”;请注意缺少的零 因此,这里有几个额外的函数来获取DLL的版本(嵌入或来自DLL文件):
下面是一个很好的方法,使用一点反射来获取包含特定类的DLL版本:
var ver = System.Reflection.Assembly.GetAssembly(typeof(!Class!)).GetName().Version;
只要更换!上课!使用在DLL中定义的类的名称,您希望获取其版本
这是我的首选方法,因为如果我为不同的部署移动dll,我不必更改文件路径。如果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);
发件人:
首先,您可能会对两种可能的“版本”感兴趣:
- Windows文件系统文件版本,适用于所有可执行文件
- 程序集生成版本,由编译器嵌入到.NET程序集中(显然仅适用于.NET程序集dll和exe文件)
AssemblyName.GetAssemblyName(@“c:\path\to\file.dll”).Version
,或Tataro的答案
请注意,您可以忽略使用
.Load()
/.LoadFrom()
方法的所有答案,因为这些方法实际上是在当前AppDomain中加载程序集-这类似于砍树查看它有多老。虽然原始问题可能不是特定于web服务,这里是一个完整的testWebService,您可以添加它来显示web服务的非缓存响应以及文件版本。我们使用文件版本而不是程序集版本,因为我们想知道一个版本,但对于所有程序集版本1.0.0.0,网站可以很容易地修补(签名和请求链接仍然处于活动状态!)。将@Class@替换为嵌入此服务的web api控制器的名称。这对于web服务上的“去/不去”以及快速的版本检查是很好的
[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;
}
[路由(“api/testWebService”)]
[异名]
[HttpGet]
公共HttpResponseMessageTestWebService()
{
HttpResponseMessageResponseMessage=Request.CreateResponse(HttpStatusCode.OK);
字符串loc=Assembly.GetAssembly(typeof(@Class@)).Location;
FileVersionInfo versionInfo=FileVersionInfo.GetVersionInfo(loc);
responseMessage.Content=newstringcontent($“XXXXX web服务获取测试成功。{DateTime.Now}
文件版本:{versionInfo.FileVersion}”);
responseMessage.Content.Headers.ContentType=新的MediaTypeHeaderValue(“文本/html”);
请求。注册表项(响应消息);
返回响应消息;
}
我发现还需要在配置下的web.config中添加以下内容,以使其真正匿名
<location path="api/testwebservice">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
事实证明@Ben的回答对我很有用。但是我需要检查产品版本,因为它是我的软件中发生的主要增量,并且遵循语义版本控制
myFileVersionInfo.ProductVersion
这种方法符合我的期望
更新:我们不需要在程序中显式地提到dll路径(在生产版本中需要),而是可以使用汇编获得产品版本
Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fileVersionInfo =FileVersionInfo.GetVersionInfo(assembly.Location);
string ProdVersion= fileVersionInfo.ProductVersion;
检查这个链接也为自动递增版本-我喜欢这个。为什么你要费心加载dll,然后使用反射来获取版本,而你真正想做的就是这样???@ben,你能编辑这篇文章吗?我看到我因为投了反对票而失去了-1个代表,我不记得这样做过。它不会让我改变它,除非你编辑文章。干杯如果您希望确保获得当前实际使用的可执行文件/dll:而不是上面的静态文件名(
@“C:\MyAssembly.dll”
),您可以使用System.Reflection.Assembly.getExecutionGassembly().Location
(或者如果是dll:Assembly.GetAssembly(typeof(aclassintedll)).Location
)这是AssemblyVersion和AssemblyFileVersion属性之间的区别。AssemblyFileVersion的标记方式与Windows API获取值的方式相同。AssemblyVersion是强名称的一部分,不一定与AssemblyFileVersion.GetExecutionGassembly()相同也可能有帮助。请注意,这仅在当前程序集静态引用所涉及的程序集时有效。这是最好的答案,因为DLL不一定是条目程序集,甚至不是从SEE调用以获取不同类型的版本信息的程序集。例如FileVersionInfo
这会将MyAssembly.dll加载到正在运行的AppDomain中。。。坏主意。我建议使用Assemblyname.GetAssemblyName
来避免这些问题将程序集加载到appdomain是缓慢的、不可逆的(如果不杀死域,您无法卸载它),需要权限,并且可能会导致副作用,例如执行beforefieldinit
类型初始值设定项,在这种情况下不需要。这些是r吗
<location path="api/testwebservice">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
myFileVersionInfo.ProductVersion
Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fileVersionInfo =FileVersionInfo.GetVersionInfo(assembly.Location);
string ProdVersion= fileVersionInfo.ProductVersion;