【问题标题】:Retrieving Assembly version from AssemblyInfo.cs file with Regex使用正则表达式从 AssemblyInfo.cs 文件中检索程序集版本
【发布时间】:2011-02-25 23:31:49
【问题描述】:

在 AssemblyInfo.cs 文件中有这个字符串:[assembly: AssemblyVersion("1.0.0.1")],我正在尝试一一检索其中的数字,每个数字都是以下结构中的一个变量。

static struct Version
{
  public static int Major, Minor, Build, Revision;
}

我正在使用这种模式来尝试检索数字:

string VersionPattern = @"\[assembly\: AssemblyVersion\(""(\d{1,})\.(\d{1,})\.(\d{1,})\.(\d{1,})""\)\]";

但是,当我使用此代码时,结果不是预期的那样,而是显示完整的字符串,就好像它是真正的匹配项,而不是组中的每个数字。

Match match = new Regex(VersionPattern).Match(this.mContents);
if (match.Success)
{
  bool success = int.TryParse(match.Groups[0].Value,Version.Major);
  ...
}

在这种情况下,this.mContents 是从文件中读取的整个文本,match.Groups[0].Value 应该是 AssemblyVersion 中的“1”

我的问题是用正则表达式一一检索这些数字。

这个小工具可以在每次 Visual Studio 构建时增加应用程序版本,我知道有很多工具可以做到这一点。

【问题讨论】:

    标签: c# .net regex match


    【解决方案1】:

    第一组显示完整匹配。您的版本号在第 1-4 组中:

    int.TryParse(match.Groups[1].Value, ...)
    int.TryParse(match.Groups[2].Value, ...)
    int.TryParse(match.Groups[3].Value, ...)
    int.TryParse(match.Groups[4].Value, ...)
    

    【讨论】:

    • 约翰·韦尔登是对的。我建议使用Expresso 来测试您的正则表达式。当我需要在蓝月亮中测试一次正则表达式时,这对我有很大帮助。
    【解决方案2】:

    System.Version 类将为您执行此操作。只需将版本字符串传递给构造函数,如下所示:

    System.Version(this.mContents);
    

    此外,可以通过以下函数调用获得 System.Version:

    Assembly.GetExecutingAssembly().GetName().Version;
    

    还可以通过指定“*”来自动设置内部版本号和修订号,如下所示:

    [assembly: AssemblyVersion("1.0.*")]
    

    我希望这会有所帮助。

    【讨论】:

    • System.Version(this.mContents); 将抛出异常,因为给定的字符串不包含有效格式并且Assembly.GetExecutingAssembly().GetName().Version; 正在获取当前正在执行的程序集,但我想从 AssemblyInfo.cs 文件中加载这些版本号
    • 是的,您的第一句话是正确的。我还回去阅读了您最初的问题并误解了。 [assembly: AssemblyVersion("1.0.*")] 对你有用吗?
    【解决方案3】:

    我偶然发现了同样的问题,但我认为稍微改变一下模式会容易得多。

    private const string AssemblyVersionStart = @"\[assembly\: AssemblyVersion\(""(\d+\.\d+\.\d+\.\d+)""\)\]";
    

    您可以通过解析包含“1.0.237.2927”之类的内容的 Groups[1] 来获得版本。

    try{
        var match= Regex.Match(text, AssemblyVersionStart);
        var version = System.Version.Parse(match.Groups[1].Value);
        ...
    }catch(...
    

    【讨论】:

      【解决方案4】:

      您是否有理由必须使用正则表达式而不是:

      string[] component = this.mContents.Split('.');
      bool success = int.TryParse(component[0], out Version.Major);
      ...
      

      【讨论】:

      • 是的,如果给定的字符串是[assembly: AssemblyVersion(\"1.0.0.0\")],那么它将分成[assembly: AssemblyVersion(\"1000\")]
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-20
      • 2018-08-20
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      相关资源
      最近更新 更多