【问题标题】:Reading the Version number from a AssemblyInfo.cs file从 AssemblyInfo.cs 文件中读取版本号
【发布时间】:2019-02-25 12:43:40
【问题描述】:

我正在尝试从 AssemblyInfo.cs 文件中提取版本号! 我正在尝试使用System.Reflection.Assembly.LoadFile(path); 但是在这样做时我得到了一个BadImageFormatException; “该模块应包含程序集清单。(来自 HRESULT 的异常:0x80131018)”。所以现在我很受伤,这不是可行的方法吗?我应该改用 RegEx 吗?

我已经阅读了很多 GetExecutingAssembly() 的示例,但我确实想从其他项目中获取版本。

澄清:我想从 AssemblyInfo.cs 文件中读取版本信息!并且不是来自已编译的文件。我正在尝试制作一个工具来更新我的版本号,然后再发布新版本。

【问题讨论】:

  • 您是否正在加载 .net 程序集并且程序集是否存在于给定路径上?
  • 呵呵,先编译,然后就可以使用Assembly.Load()了。如果你真的想从 AssemblyInfo.cs 中挖掘出来,那就写一个文本解析器。

标签: c# c#-4.0


【解决方案1】:

你可以get Assembly version without loading它为:

using System.Reflection;
using System.IO;

...

// Get assembly 
AssemblyName currentAssembly = AssemblyName.GetAssemblyName(path);
Version assemblyVersion = currentAssembly.Version;

编辑: 如果你想读取文件,那么你可以这样做:

string path = @"d:\AssemblyInfo.cs";
            if (File.Exists(path))
            {
                // Open the file to read from.
                string[] readText = File.ReadAllLines(path);
                var versionInfoLines = readText.Where(t => t.Contains("[assembly: AssemblyVersion"));
                foreach (string item in versionInfoLines)
                {
                    string version = item.Substring(item.IndexOf('(') + 2, item.LastIndexOf(')') - item.IndexOf('(') - 3);          
                    //Console.WriteLine(Regex.Replace(version, @"\P{S}", string.Empty));
                    Console.WriteLine(version);
                }

            }

//输出

1.0.*
1.0.0.0

希望对您有所帮助...

【讨论】:

  • [assembly:AssemblyVersion 中断(即删除空间)
【解决方案2】:

可以在AssemblyName.GetAssemblyName中指定目标汇编路径

AssemblyName.GetAssemblyName("ProjectB.exe").Version

【讨论】:

    【解决方案3】:

    AssemblyInfo.cs 文件被编译为 IL 程序集。

    如果您加载该程序集,您可以阅读包含您已经看过的所有示例的版本。它正在从已编译的程序集文件中读取嵌入的版本信息,它可能会被编译过程覆盖为与AssemblyInfo.cs中的值不同的值

    但是听起来你想要的是从AssemblyInfo.cs 文本文件中读取版本号,而不是编译它。

    如果是这种情况,您真的只需要使用适合您项目的格式的正则表达式,或者甚至想出一个保持简单的约定。

    这可能很简单

    var versionMatch = Regex.Match(File.ReadAllText(filename), @"AssemblyVersion\s*\(\s*""([0-9\.\*]*?)""\s*\)");
    if (versionMatch.Success)
    {
        Console.WriteLine(versionMatch.Groups[1].Value);
    }
    

    您必须考虑有关那里的约定,因为1.0.* 是一个有效的版本字符串,它在编译时转换为1.0.nnn.mmm 形式的时间戳值,而nnnmmm 部分很容易猜测但不是完全可以猜到。

    【讨论】:

      【解决方案4】:

      这里是解释从 AssemblyInfo.cs 类中读取值的代码的文章。

      http://lancelarsen.com/reading-values-from-assemblyinfo-cs/

      希望对你有帮助。

      【讨论】:

        【解决方案5】:

        听起来您正试图在 x64 环境中加载为 x86 编译的程序集,反之亦然。

        确保此代码所在的程序集是为与目标相同的环境构建的,并且您可以通过听起来像您已经阅读过的示例来获取它。

        【讨论】:

        • 不,我不想要来自 AssemblyInfo.cs 文件的版本信息,根本不是来自任何已编译的东西。我只是想知道我是否可以使用该方法来读取文件,或者它是否只是用于编译文件。
        • 那么 Hans Passant 对他的评论死心了,你需要解析原始文本。
        【解决方案6】:

        您可以继续使用 Assembly.GetName().Version,您的程序集可能是您的类的类型

        public class Test
        {
            public static void Main()
            {
                Console.WriteLine("Current assembly : " + typeof(Test).Assembly.GetName().Version);
            }
        }
        

        对于我正在处理的测试应用程序,使用上面的代码向我显示以下详细信息:

        【讨论】:

          猜你喜欢
          • 2012-01-23
          • 1970-01-01
          • 2012-01-22
          • 1970-01-01
          • 1970-01-01
          • 2014-10-22
          • 2011-01-03
          • 2012-10-16
          • 1970-01-01
          相关资源
          最近更新 更多