Se me ha encomendado la tarea de automatizar nuestro proceso de compilación con msbuild. Tenemos aproximadamente veinte proyectos de Visual C++ y veinte proyectos de C#, por lo que es una molestia editar todas las cadenas de versiones a mano. Nuestros números de versión son carnes generadas en tiempo de compilación, por lo que tenemos que pasar la cadena de versión completa como una propiedad en la línea de comandos.El uso de MSBuild para actualizar el archivo FILEVERSION en un archivo de recursos de C++ causa errores de compilación
Mi implementación inicial usó MSBuild Extension Pack's File
tarea para hacer reemplazos en los archivos .rc
y AssemblyInfo.cs
.
<FileSystem.File TaskAction="Replace" Files="@(AssemblyInfoFiles)" RegexPattern='\[assembly: AssemblyVersion\(".*"\)\]' Replacement='[assembly: AssemblyVersion("$(Version)")]'/>
<FileSystem.File TaskAction="Replace" Files="@(AssemblyInfoFiles)" RegexPattern='\[assembly: AssemblyFileVersion\(".*"\)\]' Replacement='[assembly: AssemblyFileVersion("$(Version)")]'/>
<FileSystem.File TaskAction="Replace" Files="@(RCFiles)" RegexPattern="FILEVERSION\s+\S+" Replacement="FILEVERSION $(Version)"/>
<FileSystem.File TaskAction="Replace" Files="@(RCFiles)" RegexPattern="PRODUCTVERSION\s+\S+" Replacement="PRODUCTVERSION $(Version)"/>
<FileSystem.File TaskAction="Replace" Files="@(RCFiles)" RegexPattern='VALUE\s+"FileVersion",\s*".*"' Replacement='VALUE "FileVersion", "$(Version)"'/>
<FileSystem.File TaskAction="Replace" Files="@(RCFiles)" RegexPattern='VALUE\s+"ProductVersion",\s*".*"' Replacement='VALUE "ProductVersion", "$(Version)"'/>
Esto está funcionando muy bien en los archivos AssemblyInfo.cs
, pero cuando compilar cualquiera de los proyectos de C++ recibo errores como este:
.\MyProject.rc(23): error RC2135: file not found: 0x09
.\MyProject.rc(71): error RC2135: file not found: 1
.\MyProject.rc(72): error RC2135: file not found: 6
.\MyProject.rc(73): error RC2135: file not found: 6
.\MyProject.rc(74): error RC2135: file not found: 0x3fL
.\MyProject.rc(80): error RC2135: file not found: FILEOS
.\MyProject.rc(81): error RC2135: file not found: 0x2L
.\MyProject.rc(84): error RC2164: unexpected value in RCDATA
.\MyProject.rc(86): error RC2135: file not found: BLOCK
.\MyProject.rc(88): error RC2135: file not found: VALUE
se encuentra el primer error en la línea 23, pero cuando diff MyProject.rc
contra el control de fuente todo se ve bien. Solo se cambian los números de versión, esos cambios comienzan en la línea 72, y la cadena 0x09
no aparece en ninguna parte del archivo. ¿Qué demonios está pasando aquí? Líneas 21 - 25 En este aspecto:
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
También estoy abierto a cualquier sugerencia sobre otros métodos para lograr el mismo objetivo.
Debes reemplazar el '.' con ',' en FILEVERSION para hacerlo bien en el archivo | Propiedades | Pestaña de detalles de la DLL. –