2010-12-28 12 views
5

Antecedentes:Plantilla de texto T4: ¿es posible obtener símbolos de compilación del host?

Tengo una biblioteca de juegos de código abierto escrito en C#, que es muy afinado para el rendimiento, utilizando código no seguro, la aritmética de punteros, etc. Yo he portado recientemente a la biblioteca para Windows Phone. Desafortunadamente Windows Phone no es compatible con código no seguro en absoluto, así que he tenido que camada mi código fuente con las directivas del preprocesador como este:

#if WINDOWS || XBOX 
public unsafe struct Foo 
#elif WINDOWS_PHONE 
public struct Foo 
#endif 

Debido a la cantidad de estas directivas el código base se ha vuelto bastante ilegibles y difíciles de mantener, así que he estado explorando otras opciones, una de las cuales son las plantillas de texto que usan T4.

La Pregunta:

Lo que necesito saber antes de ir demasiado lejos por el camino de la T4 es tiempo o no es posible obtener símbolos de compilación desde el interior de una plantilla de texto? He analizado los parámetros de la plantilla, pero no parecía muy fácil modificarlos desde el exterior. Lo ideal sería que lo que me gustaría ver es algo un poco como esto:

<# if (Host.CompilationSymbols.Contains("WINDOWS_PHONE") { #> 
public struct Foo 
<# { #> 

Si alguien puede arrojar algo de luz sobre este tiempo o no es posible te agradecería!

+0

Curioso: suponiendo que elimina el atributo de declaración insegura utilizando T4, ¿qué hace con el código inseguro real? – tgiphil

+0

Obviamente, no es el * único * lugar donde la plantilla alteraría las cosas; otros ejemplos serían los cambios en la barra Foo * para ref la barra Foo, o bar-> foo() cambia a bar.foo() – MattDavey

Respuesta

3

Matt, No están disponibles, no porque la compilación de su proyecto y la compilación de las plantillas están completamente aisladas a partir de VS2010.

Sin embargo, tengo una solución (algo torpe) para usted.

Si incluye un archivo de resguardo que contiene su directiva de plantilla, puede configurar las opciones del compilador con el símbolo apropiado para la compilación.

p. Ej. un esbozo simple que contiene lo siguiente, llamado Define.t4:

<#@ template compilerOptions="/d:XBOX" debug="false" hostspecific="false" language="C#" #> 

Ponga esto en un subdirectorio llamado XBOX y puso una similar en un directorio llamado TELÉFONO

<#@ template compilerOptions="/d:PHONE" debug="false" hostspecific="false" language="C#" #> 

Nota las definiciones de los símbolos del compilador.

Ahora establecer una variable de entorno para ser XBOX o TELÉFONO - digamos ARQUITECTURA

Ahora, en lugar de la directiva de plantilla en sus plantillas, incluyen el archivo Define.t4 y usted será capaz de utilizar regular de C#/VB sintaxis de la condicion No te olvides de poner el #if en su propia línea. Aquí hay un ejemplo:

<#@ include file="$(ProjectDir)%ARCHITECTURE%\Define.t4" #> 
<#@ output extension=".txt" #> 
<# 
#if XBOX #> 
public unsafe struct Foo 
<# 
#else #> 
public struct Foo 
<# 
#endif #> 

Espero que esto te mueva.

+0

Gracias Gareth! Tuve una solución alternativa cuando estaba analizando el archivo .csproj desde mi plantilla y buscando un nodo , pero tu camino es mucho más limpio :) – MattDavey

Cuestiones relacionadas