Pregunta

Estoy interesado en hacer un poco de generación de código en función de ciertos archivos que están presentes en el .csproj. ¿Qué métodos de extensibilidad están disponibles para que pueda generar un archivo .cs que se compile junto con mi proyecto?

Advertencia : inmediatamente pensé en usar plantillas T4 para la tarea. Sin embargo, esta solución debe ser compatible con Visual Studio C # Express. Creo que la versión Express no es compatible con las plantillas T4

¿Fue útil?

Solución

En C # Express, la respuesta es simple: ninguna.

C # Express no admite extensiones . La gente lo ha intentado antes y se ha puesto feo. Abogados, lío, todo. El famoso ejemplo es TestDriven. NET .

Si no te importa compilar en la línea de comandos, puedes usar una tarea personalizada msbuild o un comando de precompilación / postcompilación.

En VS2005 / VS2008 (" proper "), una " herramienta personalizada " es el una de las maneras de ir; esto implica escribir un paquete ; He hecho esto recientemente y el código está abierto para inspección.

T4 es otra opción en el futuro. No se ajustaba a mis necesidades, pero podría satisfacer las tuyas.


Como una comprobación rápida de eventos de compilación, agregué (en un proyecto expreso) eventos de precompilación y postcompilación (Propiedades del proyecto - > Eventos de compilación) de:

echo $(TargetPath)

y

echo $(SolutionDir)

respectivamente; pulsa compilar, y la salida es ahora:

------ Build started: Project: ConsoleApplication10, Configuration: Release Any CPU ------
echo D:\SomePath\ConsoleApplication10.exe
D:\SomePath\ConsoleApplication10.exe
c:\WINDOWS\Microsoft.NET\Framework\v3.5\Csc.exe /noconfig /unsafe+ /nowarn:1701,1702 /errorreport:prompt /warn:4 /define:TRACE /reference:"c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll" /reference:"c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.DataSetExtensions.dll" /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Design.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /reference:"c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Xml.Linq.dll" /debug:pdbonly /filealign:512 /optimize+ /out:obj\Release\ConsoleApplication10.exe /target:exe Form1.cs Form1.Designer.cs Form2.cs Form2.Designer.cs Program.cs Properties\AssemblyInfo.cs

Compile complete -- 0 errors, 0 warnings
ConsoleApplication10 -> D:\SomePath\ConsoleApplication10.exe
echo D:\SomePath
D:\SomePath
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========

Parece que funciona bien (es decir, se han ejecutado ambos eventos). No elegante, pero realizable. Las macros deben permitirle (con algunas imágenes) acceder a los elementos del proyecto, por ejemplo, $(ProjectPath)SomeFile.xml

Otros consejos

Puedes abrir el archivo csproj (es solo una secuencia de comandos msbuild) y agregar objetivos personalizados también.

Hay dos objetivos predeterminados que puedes anular solo para ese propósito, BeforeBuild y AfterBuild (pueden ser más, pero no estoy seguro de los otros).

También puede incluir dlls personalizados con nuevas tareas de msbuild, aunque esto generará una advertencia de seguridad al abrir el proyecto a menos que agregue la dll a la lista de SafeImports de msbuild (HKLM \ Software \ Microsoft \ Visual Studio \ 9.0 \ MSBuild \ SafeImports) , 8.0 si está utilizando VS2005.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top