12

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

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

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

4

6 回答 6

9

您可以在不加载它的情况下获取程序集版本:

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

希望这有助于...

于 2012-05-08T12:15:16.673 回答
6

您可以在AssemblyName.GetAssemblyName中指定目标程序集路径

AssemblyName.GetAssemblyName("ProjectB.exe").Version
于 2012-05-08T12:05:49.333 回答
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.mmmnnnmmm

于 2019-02-16T01:52:09.477 回答
1

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

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

希望能帮助到你。

于 2019-02-21T06:01:25.013 回答
0

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

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

于 2012-05-08T12:08:04.437 回答
0

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

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

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

在此处输入图像描述

于 2019-02-15T12:55:13.857 回答