Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从AssemblyInfo.cs文件中读取版本号_C#_C# 4.0 - Fatal编程技术网

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

C# 从AssemblyInfo.cs文件中读取版本号,c#,c#-4.0,C#,C# 4.0,我正在尝试从AssemblyInfo.cs文件中提取版本号! 我试图使用System.Reflection.Assembly.LoadFile(path)但在执行此操作时,我得到一个BadImageFormatException;模块应包含程序集清单。(HRESULT异常:0x80131018)”。所以现在我想,这不是一个可行的方法吗?我应该改用正则表达式吗 我已经阅读了许多关于getExecutionGassembly()的示例,但我确实希望从其他项目获得该版本 澄清:我想从AssemblyI

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

我已经阅读了许多关于
getExecutionGassembly()
的示例,但我确实希望从其他项目获得该版本


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

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


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

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

您可以将其作为:

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.GetName().Version,其中程序集可以是类的类型

public class Test
{
    public static void Main()
    {
        Console.WriteLine("Current assembly : " + typeof(Test).Assembly.GetName().Version);
    }
}
对于我正在使用的测试应用程序,使用上述代码向我显示以下详细信息:


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

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

然而,听起来您想要的是从
AssemblyInfo.cs
文本文件中读取版本号,而不是编译下来

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

这可以简单到

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

你必须考虑周围的惯例,因为<代码> 1 .*/COD>是一个有效的版本字符串,它在编译时转化为表格<代码> 1 .nnn.MMM的时间戳值。和
nnn
mmm
部分接近可猜测,但不完全可猜测。

本文解释了从AssemblyInfo.cs类读取值的代码


希望有帮助。

您正在加载.net程序集,并且程序集是否存在于给定路径上?呵呵,先编译它,然后您可以使用Assembly.Load()。如果你真的想从AssemblyInfo.cs中挖掘它,那么就编写一个文本解析器。不,我不想从AssemblyInfo.cs文件中获取版本信息,根本不想从任何编译过的东西中获取。我只是想知道我是否也可以使用该方法来读取文件,或者它是否仅用于已编译的文件。然后Hans Passant对他的评论死记硬背,您需要解析原始文本。使用
[assembly:AssemblyVersion
中断(即,删除了空格)
public class Test
{
    public static void Main()
    {
        Console.WriteLine("Current assembly : " + typeof(Test).Assembly.GetName().Version);
    }
}