2009-06-12 14 views
5

¿Alguien sabe de una utilidad para preprocesar un archivo fuente C# sin compilarlo, de manera similar a usar el indicador -E en GCC? He intentado utilizar GCC - procesa con éxito #if directivas, pero se ahoga con cualquier #region directivas ...¿Existe una herramienta de preprocesamiento C#?

Idealmente, me gustaría ser capaz de ejecutar la herramienta sobre un archivo .cs para eliminar cualquier #if bloques que evalúan a falso, y, opcionalmente, ser capaz de bandera si se debe quitar/dejar comentarios intactas, #region, #pragma directivas etc.

para poner esto en contexto, quiero ser capaz de un poco de publicar el código fuente que forma parte de un (mucho) proyecto más grande, al tiempo que se eliminan las partes que solo son relevantes para el proyecto más grande. A modo de ejemplo, hay trozos de código que tener este aspecto:

#if (SUBPROJECT) 
namespace SubProject 
#else 
namespace CompleteProject 
#endif 
{ 
    public class SomeClass() 
    { 
#if (!SUBPROJECT) 
    // This might call a method contained in an assembly that potentially 
    // won't be available to the sub-project, or maybe a method that hooks 
    // into a C library via P/Invoke... 
    string result = CallSomeCleverMethod(); 
#else 
    // This might call a method that performs a simplified version of the 
    // above, but does so without the above's assembly or P/Invoke 
    // dependencies... 
    string result = CallSomeSimpleMethod(); 
#endif 
    } 
} 

Por favor, recuerda que no estoy tratando de hacer construye aquí - esto es puramente sobre la publicación de sólo un subconjunto del código fuente de un proyecto más amplio.

Cualquier idea/ayuda apreciada.

Respuesta

3

Resulta que usar el preprocesador C de GNU (cpp) directamente (en lugar de a través de gcc) proporciona más control sobre la salida. Usando esto, yo era capaz de procesar los archivos de origen de una manera adecuada ...

He aquí un ejemplo:

cpp -C -P -DSUBPROJECT Input.cs Output.cs 

He intentado conseguir la/C++ C proporcionada con Visual Studio para hacer algo similar , pero se dio por vencido después de un tiempo ...

+0

¿Dónde puedo obtener el ejecutable? – NightOwl888

+0

Es parte de la colección de compiladores de GNU, probablemente ya esté instalada si está ejecutando OS X o Linux. Si está ejecutando Windows, MinGW es probablemente lo que necesita. –

+0

Encontré uno que funciona aquí: http://mcpp.sourceforge.net/download.html, pero el ejecutable es mccp en lugar de cpp. – NightOwl888

1

¿No sería más fácil, y más idiomáticamente C#, crear interfaces y tener diferentes implementaciones de esas interfaces? ¿Un conjunto que puede empaquetar como una biblioteca y redistribuir?

+0

Necesito poder procesar nombres reales de clase/espacio de nombres, metadatos (atributos personalizados, etc.) - vea el ejemplo del espacio de nombres en la pregunta. Tampoco quiero agregar complejidad de implementación donde no se necesita. –

+2

¿No cree que el código anterior ya es complejo?Sigo pensando que realmente estás llegando a esto desde una mentalidad de C++ y tal vez te faltan algunas herramientas que C# ofrece, ¡pero lo mejor es encontrar una solución que te haga feliz! –

2

No conozco un preprocesador para C# que le permita exportar un subconjunto de su código fuente sin construirlo.

Sin embargo, debe poder lograr el mismo efecto utilizando una plantilla de generación de código. Simplemente cambie a las directivas del preprocesador por el equivalente de la plantilla adecuada.

Visual Studio 2008 tiene una herramienta incorporada de generación de código llamada T4. Hay otras opciones de terceros como CodesmithTools o la libre MyGeneration.Net

+1

Eso suena prometedor - No había pensado en T4 - Lo investigaré e informaré pronto ... –

2

no creo que hay ningún banderas para el CSC o MSC (compilador mono) para dar salida a los archivos preprocesados.

Si tuviera que hacer esto, y era un pequeño subconjunto que compilaría y luego usaría Reflector para descompilar nuevamente a C# y exportar los archivos. Si tiene muchos archivos, hay un Reflector Add-In llamado FileGenerator for Reflector.

Lamentablemente, esta no será una copia fiel de su base de código: reformatará todo el código y perderá todos los comentarios.

Cuestiones relacionadas