with visual studio started run mundo hola ejecutar dotnet compile como code and c# visual-studio msbuild prebuild generated

started - visual studio code run c# code



Precompila la tarea de MSBuild para actualizar AssemblyInfo no sincronizada con el exe incorporado (4)

Interesante, escribí mi propia tarea personalizada que está enganchada a BeforeBuild y está funcionando bien. Nunca tuve un problema de VS o MSBuild a través de la línea de comandos. Así que yo diría explorar BeforeBuild un poco más ...

Lo sé porque utilizamos nuestro número de compilación del servidor de compilación (CruiseControl.NET) como la parte de "compilación" de la versión, que está integrada en todos los ensamblajes (compartimos los mismos AssemblyInfo.cs para AssemblyVersion y AssemblyFileVersion en ensamblajes en la solución) y esto luego se empuja (a través de la tarea FileUpdate) a una variable en nuestro proyecto WiX y también se utiliza para etiquetar el nombre del archivo MSI.

<Target Name="BeforeBuild"> <CallTarget Targets="UpdateAssemblyInfo" /> </Target> <Target Name="UpdateAssemblyInfo" Condition="''$(CIBuildNumber)'' != ''''"> <UpdateVersion Attribute="AssemblyFileVersion" AssemblyInfo="./Properties/AssemblyInfo.cs" BuildNumber="$(CIBuildNumber)" /> </Target>

Si buscas en Google, deberías encontrar otros ejemplos ... lo siento, no puedo darte el código UpdateVersion, necesitaría permiso de mi trabajo, pero si no puedes encontrar nada adecuado en la red, las tareas personalizadas son fáciles. escribir y lo anterior debería ayudar.

Estoy usando una tarea de precompilación en Visual Studio 2008 que invoca a msbuild:

C:/WINDOWS/Microsoft.NET/Framework/v3.5/MSBuild.exe $(MSBuildProjectDirectory)/version.targets /p:Configuration=$(ConfigurationName)

Dentro de version.targets, estoy actualizando el archivo AssemblyInfo.cs para reemplazar la información de la versión:

<FileUpdate Encoding="ASCII" Files="$(MSBuildProjectDirectory)/Properties/AssemblyInfo.cs" Regex="AssemblyInformationalVersion/(&quot;.*&quot;/)/]" ReplacementText="AssemblyInformationalVersion(&quot;Product $(ConfigurationString) ($(buildDate))&quot;)]" />

Cuando construyo el proyecto a través de Visual Studio 2008, se desarrolla sin ningún problema.

Pero cuando miro la información de la versión del exe resultante, contiene la marca de tiempo anterior a pesar de que AssemblyInfo.cs ha sido cambiado con el de "correcto".

Parece que los cambios previos a la compilación no son vistos por la tarea de compilación principal y siempre están atrasados.

¿Alguna idea de lo que estoy haciendo mal?


No creo que estés haciendo algo malo, es un error.

Lo he informado aquí - compruebe si puede reproducirlo y agregar una validación, quizás podamos arreglarlo por MS.

EDITAR: Probé la sugerencia de "Si" para actualizar el archivo en el evento "BeforeBuild"; sin embargo, sigo obteniendo el mismo resultado erróneo con Visual Studio 2008 / SP1.

ACTUALIZACIÓN / SOLUCIÓN : MS ha respondido al informe de error. Como solución alternativa puede agregar

<UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable>

a su archivo csproj.


+1 para el <UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable> , aunque ni la solución aceptada ni el artículo vinculado especificaron que la línea se debe agregar al primer elemento <PropertyGroup> en el archivo .csproj .

También es un problema solo con Visual Studio, ya que la invocación de msbuild desde la línea de comandos en el mismo archivo .csproj (sin el truco) verá los archivos de código generados compilados de inmediato (y no las versiones anteriores).

Además, me gustaría recomendar que este tema se etiquete con lo siguiente, ya que tuve que buscar mucho para encontrarlo:

  1. Estudio visual
  2. compilador
  3. BeforeBuild
  4. generado
  5. .RED
  6. do#

Use algo como a continuación para cambiar cualquier contenido de cualquier archivo. Aquí estoy cambiando el valor de la fecha de compilación en hallo.aspx cada vez que creo una compilación.

por ejemplo, contenido de Hallo.aspx

<BuildDate> 12-23.2011 </ BuildDate>

<!-- regular expression to get value between html node: "[^<>]+(?=[<])" --> <FileUpdate Files="$(AboutDir)Hallo.aspx" Regex="Builddate[^&lt;&gt;]+(?=[&lt;])" ignoreCase="true" ReplacementText="BuildDate: $(Day)-$(Month)-$(Year)" />