C# 如何获取程序集文件版本

C# 如何获取程序集文件版本,c#,.net,assemblies,version,C#,.net,Assemblies,Version,在AssemblyInfo中有两个程序集版本: AssemblyVersion:指定要属性化的程序集的版本 AssemblyFileVersion:指示编译器为Win32文件版本资源使用特定的版本号。Win32文件版本不要求与程序集的版本号相同 我可以通过以下代码行获得汇编版本: Version version = Assembly.GetEntryAssembly().GetName().Version; 但是我如何才能获得汇编文件版本呢?更新:正如Richard Grimes在@Iain和

AssemblyInfo
中有两个程序集版本:

  • AssemblyVersion
    :指定要属性化的程序集的版本
  • AssemblyFileVersion
    :指示编译器为Win32文件版本资源使用特定的版本号。Win32文件版本不要求与程序集的版本号相同
  • 我可以通过以下代码行获得
    汇编版本

    Version version = Assembly.GetEntryAssembly().GetName().Version;
    

    但是我如何才能获得
    汇编文件版本呢?

    更新:正如Richard Grimes在@Iain和@Dmitry Lobanov中提到的,我的答案在理论上是正确的,但在实践中是错误的

    正如我在无数书籍中所记得的那样,当人们使用
    [assembly:XXXAttribute]
    设置这些属性时,编译器会将它们提升到
    VERSIONINFO
    资源中

    出于上述原因,您需要使用中的方法,因为从属性中提取信号后,属性将被剥离


    公共静态字符串GetProductVersion() { var属性=(AssemblyVersionAttribute)程序集 .getExecutionGassembly() .GetCustomAttributes(typeof(AssemblyVersionAttribute),true) .Single(); 返回attribute.InformationalVersion; } (From-如上所述,如果您正在寻找不同的属性,请将其替换为上述属性)

    请参阅我上面的评论,要求澄清您真正想要什么。希望是这样:

    System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
    System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
    string version = fvi.FileVersion;
    
    有:组件文件产品。它们由不同的功能使用,如果不显式指定它们,则采用不同的默认值

    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;
    

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

    versionlabel.Text = "Version " + Application.ProductVersion;
    
    此方法要求引用
    System.Windows.Forms

    使用以下方法:

    ((AssemblyFileVersionAttribute)Attribute.GetCustomAttribute(
        Assembly.GetExecutingAssembly(), 
        typeof(AssemblyFileVersionAttribute), false)
    ).Version;
    
    或者这个:

    new Version(System.Windows.Forms.Application.ProductVersion);
    


    与“程序集版本”相对的“程序集文件版本”是什么意思?你能举个例子吗?@Xiaofu--“汇编版本”是.NET内部使用的。“程序集文件版本”是指在文件上单击鼠标右键,然后转到“属性”和“详细信息”选项卡时显示的内容。它们不一样。我发现在确定AppData中的user.config位置时使用的是程序集版本。嘿,鲁本,注意2。首先,询问的问题是AssemblyFileVersion而不是AssemblyVersion。其次,Assembly.getExecutionGassembly().GetCustomAttributes(typeof(AssemblyVersionAttribute),true)返回长度为0的数组。我认为这是因为AssemblyVersionAttribute不是一个自定义属性。你是第一点,这就是为什么我说“如果你在寻找一个不同的属性,请将其替换为上面的属性”(IIRC我没有尝试过)。你是第二个,这似乎有道理,但没有时间深入研究…是的,你实际上无法通过.GetCustomAttribute()获取AssemblyVersion属性,只能通过
    AssemblyName.version
    属性检索程序集版本。但对于所有其他属性,这都是正确的方法it@DmitryLobanov伊恩,谢谢你的提示。我希望编辑足够涵盖它,使答案值得保留而不是删除-让我知道!我在.net core 3上使用了
    AssemblyInformationalVersionAttribute
    而不是
    AssemblyVersionAttribute
    。1@Xiaofu:是否有办法从AssemblyInfo.cs文件获取版本号?此代码的一个问题是,如果未指定版本号和修订号,它实际上将返回1.0.*.*。AssemblyName.GetAssemblyName(assembly.Location).Version.ToString();将获得“已编译”的版本号-如果您以相同的方式设置两个版本,则该版本号应与FileVersion相同。@DoguhanUluca它们是两个不同的东西。这将为您提供程序集版本,而不是文件版本。“如果您以相同的方式设置两个版本”,这是一种解决方法,而不是解决方案。
    FileVersionInfo
    是否只有
    string
    属性,而没有
    Version
    属性?@Yitzchak:
    Assembly.GetEntryAssembly()
    在Office加载项上下文中以及许多其他情况下返回NULL。此外,如果您考虑加载项/插件-EntryAssembly是主机应用程序,并且除此之外,您通常还需要代码的版本(TM):),值得在回答中添加以下内容:回答中使用的
    assembly.Location
    也可以为空(即,谷歌搜索出的第一个随机案例:)这可能比使用null entry-assembly更为常见。请注意,这需要对System.Windows.Forms的引用,因此可能不适用于所有应用程序。不幸的是,这是一个字符串。如果您想自己将其格式化为更简单的“v1.08”格式,则这并不理想。如果您实际获取版本对象以获取子组件作为整数,则更方便。此外,这会从AssemblyInfo中获取AssemblyFileVersion,而不是AssemblyVersion,因此请注意,高代表性用户是否可以编辑此答案,以更清楚地说明此答案仅适用于Windows窗体?这正是我要查找的,谢谢回答!当这篇博文有一天消失时,这里将其浓缩为参考:
    string assemblyVersion=Assembly.getExecutionGassembly().GetName().Version.ToString();string assemblyVersion=Assembly.LoadFile(“您的程序集文件”).GetName().Version.ToString();字符串fileVersion=FileVersionInfo.GetVersionInfo(Assembly.GetExecutionGassembly().Location).fileVersion;字符串productVersion=FileVersionInfo.GetVersionInfo(Assembly.GetExecutionGassembly().Location).productVersion对于那些希望在AssemblyInfo.cs文件中指定这些的人,对于assemblyVersion使用(使用您想要的任何数字)==
    [assembly:assemblyVersion(“2.0.*”)]
    对于fileVersion使用===new Version(System.Windows.Forms.Application.ProductVersion);