2010-12-16 8 views
22

Dado este fragmento de AssemblyInfo.cs de Blah.dll:FileVersionInfo y AssemblyInfo

[assembly: AssemblyVersion("3.3.3.3")] 
[assembly: AssemblyFileVersion("2.2.2.2")] 

Y luego, en un .exe independiente:

var fileInfo = FileVersionInfo.GetVersionInfo("/path/to/Blah.dll"); 
fileInfo.ProductVersion == fileInfo.FileVersion == true; 

Otros SO preguntas muestran ProductVersion ser "correcta", curioso si hay algo extraño acerca de cómo lo estoy usando.

¿No debería ser ProductVersion "3.3.3.3" y FileVersion ser "2.2.2.2"? ¿Qué provocaría que informe ambas propiedades como AssemblyFileVersion?

Gracias!

+3

... y ¿cuál es la pregunta? – Vlad

+0

aclarado, gracias :-) – ecoffey

Respuesta

38

Encontré la respuesta originalmente here. Estoy repitiendo los detalles para facilitar la referencia.

Hay tres 'versiones' que se pueden incluir en el archivo AssemblyInfo.cs:

[assembly: AssemblyVersion("1.1.1.1")] 
[assembly: AssemblyInformationalVersion("2.2.2.2")] 
[assembly: AssemblyFileVersion("3.3.3.3")] 

AssemblyInformationalVersion por defecto AssemblyFileVersion si no se especifica. Del mismo modo, AssemblyInformationalVersion yAssemblyFileVersion por defecto a AssemblyVersion si ambos no se especifican.

En su ejemplo, el archivo AssemblyInfo.cs no incluía AssemblyInformationalVersion, por lo que su valor predeterminado es AssemblyFileVersion. Como verá a continuación, AssemblyInformationalVersion se mapea en la propiedad FileVersionInfo.ProductVersion, lo que explica por qué la prueba es verdadera.

Obviamente, hay un par de aspectos frustrantes en esto. En primer lugar, no hay forma (que yo sepa) de establecer el AssemblyInformationalVersion desde Visual Studio. Debe modificar el archivo AssemblyInfo.cs directamente para incluir este atributo. En segundo lugar, AssemblyInformationalVersion se asigna a la propiedad FileVersionInfo.ProductVersion, que no es intuitiva. El atributo debería llamarse más apropiadamente AssemblyProductVersion.

Dicho esto, ¿cómo recuperamos estos valores en el código? De esta manera:

AssemblyFileVersion   => System.Diagnostics.FileVersionInfo.FileVersion 
AssemblyInformationalVersion => System.Diagnostics.FileVersionInfo.ProductVersion 
AssemblyVersion    => System.Reflection.Assembly.Version 

En el caso de AssemblyVersion, utilice esto:

string ver = Assembly.GetExecutingAssembly().GetName().Version.ToString(); 
+0

Acepté la respuesta porque esa es la explicación correcta, pero esperaba una solución que no implicara la carga (o incluso la carga de ReflectionOn) del ensamblaje. ¡Pero gracias por buscar al menos eso! – ecoffey

+1

Si desea poder leer la versión de ensamblado desde un archivo DLL sin cargar o solo de reflexión, puede leer los metadatos puramente como una fuente de datos, en un modelo de objetos utilizando la infraestructura común de compilación (CCI) de Microsoft. biblioteca. Le interesará el MetaDataReaderHost. Es rápido, y no 'CLR carga' la DLL de ninguna manera, lo que le da la ventaja de poder leer los metadatos de las DLL que se compilan contra las versiones más nuevas del tiempo de ejecución que su aplicación, con lo que futuras pruebas de su aplicación. http://ccimetadata.codeplex.com/ – Adam

+1

@ecoffey: "System.Diagnostics.FileVersionInfo.GetVersionInfo (fullPath) "no carga el ensamblado, y puede llamar a" FileVersion "o" ProductVersion ". – user276648

Cuestiones relacionadas