c# - versiones - FileVersionInfo y AssemblyInfo
team foundation version control tool (1)
Dado este fragmento de código de Blah.dll''s AssemblyInfo.cs:
[assembly: AssemblyVersion("3.3.3.3")]
[assembly: AssemblyFileVersion("2.2.2.2")]
Y luego en un .exe separado:
var fileInfo = FileVersionInfo.GetVersionInfo("/path/to/Blah.dll");
fileInfo.ProductVersion == fileInfo.FileVersion == true;
Otras preguntas de SO muestran que ProductVersion es "correcto", curiosidad por saber 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é haría que reportara ambas propiedades como AssemblyFileVersion?
Encontré la respuesta originalmente here . Estoy repitiendo los detalles para facilitar la referencia.
Hay tres ''versiones'' que pueden incluirse en el archivo AssemblyInfo.cs:
[assembly: AssemblyVersion("1.1.1.1")]
[assembly: AssemblyInformationalVersion("2.2.2.2")]
[assembly: AssemblyFileVersion("3.3.3.3")]
AssemblyInformationalVersion
defecto es AssemblyFileVersion
si no se especifica. Del mismo modo, AssemblyInformationalVersion
y AssemblyFileVersion
predeterminan a AssemblyVersion
si no se especifican ambos.
En su ejemplo, el archivo AssemblyInfo.cs no incluyó AssemblyInformationalVersion
, por lo que el valor predeterminado es AssemblyFileVersion
. Como verá a continuación, AssemblyInformationalVersion
asigna a la propiedad FileVersionInfo.ProductVersion
, lo que explica por qué la prueba devuelve true.
Obviamente, hay un par de aspectos frustrantes de esto. Primero, no hay forma (que yo sepa) de establecer la AssemblyInformationalVersion
desde Visual Studio. Debe modificar el archivo AssemblyInfo.cs directamente para incluir este atributo. En segundo lugar, AssemblyInformationalVersion
asigna a la propiedad FileVersionInfo.ProductVersion
, que no es intuitiva. El atributo debería ser más apropiadamente llamado AssemblyProductVersion
. Y al parecer, un título es también una descripción , etc.
Dicho esto, ¿cómo recuperamos estos valores (y los relacionados) en el código? Me gusta esto:
AssemblyFileVersion => System.Diagnostics.FileVersionInfo.FileVersion AssemblyInformationalVersion => System.Diagnostics.FileVersionInfo.ProductVersion AssemblyVersion => System.Reflection.Assembly.Version /// others... AssemblyTitle => System.Diagnostics.FileVersionInfo.FileDescription AssemblyDescription => System.Diagnostics.FileVersionInfo.Comments AssemblyProduct => System.Diagnostics.FileVersionInfo.ProductName AssemblyCompany => System.Diagnostics.FileVersionInfo.CompanyName AssemblyCopyright => System.Diagnostics.FileVersionInfo.LegalCopyright AssemblyTrademark => System.Diagnostics.FileVersionInfo.LegalTrademarks
En el caso de AssemblyVersion
, usa esto:
string ver = Assembly.GetExecutingAssembly().GetName().Version.ToString();