如何获取程序集文件版本

Eny*_*yra 687 .net c# assemblies version

AssemblyInfo有两个集版本:

  1. AssemblyVersion:指定要归属的程序集的版本.
  2. AssemblyFileVersion:指示编译器使用Win32文件版本资源的特定版本号.Win32文件版本不需要与程序集的版本号相同.

我可以Assembly Version使用以下代码行:

Version version = Assembly.GetEntryAssembly().GetName().Version;
Run Code Online (Sandbox Code Playgroud)

但我怎么能得到Assembly File Version

Xia*_*ofu 833

请参阅上面的评论,要求澄清您真正想要的内容.希望这是它:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fvi.FileVersion;
Run Code Online (Sandbox Code Playgroud)

  • 这段代码的一个问题是,如果你没有指定Build和Revision数字,它实际上会返回1.0.*.*.AssemblyName.GetAssemblyName(assembly.Location).Version.ToString(); 将为您提供"已编译"的版本号 - 如果您以相同的方式设置两个版本,则应与FileVersion相同. (56认同)
  • @DoguhanUluca他们是两个不同的东西.那将为您提供程序集版本,而不是文件版本."如果你以同样的方式设置两个版本"是一种解决方法,而不是解决方案. (16认同)
  • @Xiaofu:有没有办法从AssemblyInfo.cs文件中获取版本号? (4认同)
  • @Yitzchak:`Assembly.GetEntryAssembly()`返回NULL,例如在Office加载项的上下文中,以及在许多其他情况下.此外,如果您考虑插件/插件 - EntryAssembly是主机应用程序,并且通常您需要YourCode(TM)的版本:)除此之外,值得在答案中添加"答案"中使用的"assembly.Location"也可以为null(即第一个随机案例用Google搜索:https://github.com/Azure/azure-functions-host/issues/1233),这可能比使用null入口汇编更频繁. (3认同)
  • “FileVersionInfo”是否只有“string”属性而没有“Version”属性? (2认同)

小智 189

三个版本: 程序集,文件产品.它们由不同的功能使用,如果您没有明确指定它们,则采用不同的默认值.

string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); 
string assemblyVersion = Assembly.LoadFile("your assembly file").GetName().Version.ToString(); 
string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; 
string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;
Run Code Online (Sandbox Code Playgroud)

  • 当博客文章有一天消失时,这里将其归结为参考:`string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); string assemblyVersion = Assembly.LoadFile('your assembly file').GetName().Version.ToString(); string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;` (15认同)
  • 对于那些想在AssemblyInfo.cs文件中指定这些的人,可以使用assemblyVersion(使用你想要的任何数字)===`[assembly:AssemblyVersion("2.0.*")]`for fileVersion use ===`[assembly :AssemblyFileVersion("2.0.*")]`和productVersion使用===`[assembly:AssemblyInformationalVersion("2.0.*")]`最后一个可能为`SemVer`兼容性采用字符串后缀:`[assembly:AssemblyInformationalVersion ( "2.0.0-α")]` (3认同)

小智 62

当我想访问应用程序文件版本(在程序集信息 - >文件版本中设置)时,比如在表单加载时设置标签的文本以显示版本,我刚刚使用过

versionlabel.Text = "Version " + Application.ProductVersion;
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这需要引用System.Windows.Forms,因此可能不适合所有应用程序. (53认同)
  • 不幸的是,这是一个字符串.如果您想将其自身格式化为更简单的"v1.08"格式,则不理想.如果您实际获得版本对象以从整数获取子组件,那么会更加方便. (2认同)

Rub*_*ink 22

更新:正如Richard Grimes在我引用的帖子提到的那样,@ Iain和@Dmitry Lobanov,我的答案在理论上是对的,但在实践中却是错误的.

正如我应该记得的无数书籍等,当使用它设置这些属性时[assembly: XXXAttribute],它们会被编译器劫持并放入VERSIONINFO资源中.

由于上述原因,您需要在@ Xiaofu的答案中使用该方法,因为在从它们提取信号之后剥离属性.


public static string GetProductVersion()
{
  var attribute = (AssemblyVersionAttribute)Assembly
    .GetExecutingAssembly()
    .GetCustomAttributes( typeof(AssemblyVersionAttribute), true )
    .Single();
   return attribute.InformationalVersion;
}

(来自http://bytes.com/groups/net/420417-assemblyversionattribute - 如前所述,如果您正在寻找不同的属性,请将其替换为上述内容)


小智 10

用这个:

((AssemblyFileVersionAttribute)Attribute.GetCustomAttribute(
    Assembly.GetExecutingAssembly(), 
    typeof(AssemblyFileVersionAttribute), false)
).Version;
Run Code Online (Sandbox Code Playgroud)

或这个:

new Version(System.Windows.Forms.Application.ProductVersion);
Run Code Online (Sandbox Code Playgroud)