C# 以编程方式获取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

是否可以通过编程方式从任何.NET DLL获取版本号


如果是,如何使用?

您可以使用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是.netWin32,则此方法有效。反射方法仅在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;