2011-02-25 14 views
6

Dentro del archivo AssemblyInfo.cs hay esta cadena: [assembly: AssemblyVersion("1.0.0.1")] y estoy tratando de recuperar uno por uno los números en él, cada uno es una variable en la siguiente estructura.Recuperando la versión de Assembly del archivo AssemblyInfo.cs con Regex

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

estoy usando este patrón para tratar de recuperar los números:

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

Sin embargo, cuando se utiliza este código, el resultado no es el esperado, en cambio, muestra la cadena completa como si fuera la combinación real y no cada número en un grupo.

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

En este caso this.mContents es todo el texto leído desde el archivo y match.Groups[0].Value debe ser "1" de la AssemblyVersion

Mi pregunta es recuperar estos números uno por uno con expresiones regulares.

Esta pequeña herramienta consiste en incrementar la versión de la aplicación cada vez que Visual Studio la construye y sé que hay muchas herramientas para hacerlo.

Respuesta

3

El primer grupo está mostrando el partido completo. Sus números de versión están en los grupos 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, ...) 
+0

John Weldon tiene razón. Yo recomendaría usar [Expresso] (http://www.ultrapico.com/Expresso.htm) para probar sus expresiones regulares. Me ha sido de gran ayuda cuando necesito probar expresiones regulares una vez en una luna azul. – bigfoot

3

La clase System.Version lo hará por usted. Sólo tiene que pasar en la cadena de versión al constructor, así:

System.Version(this.mContents); 

Además, un System.Version se puede obtener por la función siguiente llama:

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

Los números de compilación y revisión también puede automáticamente establecerse especificando un '*' como se muestra a continuación:

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

Espero que esto ayude.

+0

'System.Version (this.mContents);' lanzará una excepción ya que la cadena dada no contiene un formato válido y 'Assembly.GetExecutingAssembly(). GetName(). Version;' está obteniendo el ensamblado de ejecución actual pero yo quería cargar estos números de versión desde el archivo AssemblyInfo.cs – jfevia

+1

Sí, su primera afirmación es correcta. También volví y leí su pregunta inicial y la malentendí. Will '[assembly: AssemblyVersion (" 1.0. * ")]' ¿Funcionará en su caso? – Gerry

0

¿Hay alguna razón por la que debe utilizar una expresión regular en lugar de:

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

Sí, si la cadena dada es '[assembly: AssemblyVersion (\" 1.0.0.0 \ ")]' se dividirá en '[assembly: AssemblyVersion (\" 1', '0',' 0' y '0 \ ")]' – jfevia

1

me encontré con el mismo problema, pero creo que va a ser mucho más fácil con un patrón ligeramente cambiado.

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

que descarga la versión mediante el análisis de los Grupos [1], que contendrán algo así como "1.0.237.2927".

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