Получение версии сборки из файла AssemblyInfo.cs с помощью Regex

Внутри файла 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 должно быть «1» из AssemblyVersion.

Мой вопрос заключается в том, чтобы получить эти числа один за другим с помощью Regex.

Этот небольшой инструмент предназначен для увеличения версии приложения каждый раз, когда Visual Studio создает его, и я знаю, что для этого существует множество инструментов.


person Community    schedule 25.02.2011    source источник


Ответы (4)


Первая группа показывает полное совпадение. Ваши номера версий находятся в группах 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, ...)
person John Weldon    schedule 25.02.2011
comment
Джон Уэлдон прав. Я бы рекомендовал использовать Expresso для тестирования ваших регулярных выражений. Это очень помогло мне, когда мне нужно было протестировать регулярные выражения один раз в голубую луну. - person bigfoot; 26.02.2011

Класс System.Version сделает это за вас. Просто передайте строку версии в конструктор, например:

System.Version(this.mContents);

Кроме того, System.Version можно получить с помощью следующих вызовов функций:

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

Номера сборки и версии также можно установить автоматически, указав «*», как показано ниже:

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

Надеюсь, это поможет.

person Gerry    schedule 26.02.2011
comment
System.Version(this.mContents); выдаст исключение, поскольку заданная строка не содержит допустимого формата, а Assembly.GetExecutingAssembly().GetName().Version; получает текущую исполняемую сборку, но я хотел загрузить эти номера версий из файла AssemblyInfo.cs. - person ; 26.02.2011
comment
Да, ваше первое утверждение верно. Я также вернулся и прочитал ваш первоначальный вопрос и неправильно понял. Будет ли [assembly: AssemblyVersion("1.0.*")] работать в вашем случае? - person Gerry; 27.02.2011

Я наткнулся на ту же проблему, но я думаю, что будет намного проще с немного измененным шаблоном.

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

Вы получаете версию, анализируя группы [1], которые будут содержать что-то вроде «1.0.237.2927».

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

Есть ли причина, по которой вы должны использовать регулярное выражение вместо:

string[] component = this.mContents.Split('.');
bool success = int.TryParse(component[0], out Version.Major);
...
person Dour High Arch    schedule 26.02.2011
comment
Да, если задана строка [assembly: AssemblyVersion(\"1.0.0.0\")], она будет разделена на [assembly: AssemblyVersion(\"1, 0, 0 и 0\")]. - person ; 26.02.2011