从AssemblyInfo.cs文件中读取版本号

时间:2012-05-08 12:03:14

标签: c# c#-4.0

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

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

澄清:我想阅读 AssemblyInfo.cs 文件中的版本信息!编译文件中的。我正在尝试创建一个工具来更新我的版本号,然后再发布新版本。

6 个答案:

答案 0 :(得分:8)

您可以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

希望这有帮助...

答案 1 :(得分:5)

您可以在AssemblyName.GetAssemblyName

中指定目标装配路径
AssemblyName.GetAssemblyName("ProjectB.exe").Version

答案 2 :(得分:1)

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格式的时间戳值,而nnn和{{ 1}}部分几乎可以猜测,但不能精确猜测。

答案 3 :(得分:0)

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

确保此代码所在的程序集是针对与目标相同的环境构建的,您可以使用您读过的示例来获取它。

答案 4 :(得分:0)

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

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

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

enter image description here

答案 5 :(得分:0)

这是一篇文章,解释了从AssemblyInfo.cs类读取值的代码。

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

希望有帮助。