2009-06-12 17 views
5

Qualcuno sa di un'utilità per il preprocesso di un file sorgente C# senza compilarlo, in modo simile all'utilizzo del flag -E in GCC? Ho provato ad utilizzare il GCC - elabora con successo #if direttive, ma soffoca su qualsiasi #region direttive ...Esiste uno strumento di preelaborazione C#?

Idealmente, mi piacerebbe essere in grado di eseguire lo strumento su un file con estensione cs per rimuovere eventuali blocchi che valutano #if a falso, e opzionalmente essere in grado di segnalare se rimuovere/lasciare commenti intatti, #region, #pragma direttive ecc.

Per mettere questo contesto, voglio essere in grado di pubblicare un codice sorgente che fa parte di un (molto) progetto più ampio, rimuovendo parti che sono rilevanti solo per il progetto più ampio. Per fare un esempio, ci sono pezzi di codice che assomigliano a questo:

#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 
    } 
} 

prega ricordo io non sto cercando di fare costruisce qui - questo è puramente sulla pubblicazione di solo un sottoinsieme del codice sorgente di un progetto più ampio.

Qualsiasi idea/aiuto apprezzato.

risposta

3

Si scopre che utilizzando il preprocessore GNU C (cpp) direttamente (anziché tramite gcc) si ottiene un maggiore controllo sull'uscita. Usando questo, sono stato in grado di elaborare i file di origine in modo adeguato ...

Ecco un esempio:

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

ho cercato di ottenere il/C++ compiler C fornito con Visual Studio per fare qualcosa di simile , ma dopo un po 'rinunciò ...

+0

Dove posso ottenere l'eseguibile? – NightOwl888

+0

Fa parte della raccolta del compilatore GNU - probabilmente è già installato se stai usando OS X o Linux. Se stai usando Windows, MinGW è probabilmente quello di cui hai bisogno. –

+0

Ne ho trovato uno che funziona qui: http://mcpp.sourceforge.net/download.html, ma l'eseguibile è mccp piuttosto che cpp. – NightOwl888

1

Potrebbe non essere più semplice e più idiota C#, creare interfacce e implementazioni diverse di tali interfacce? Un set che puoi impacchettare come libreria e ridistribuirlo?

+0

Devo essere in grado di elaborare nomi di classi/nomi di spazio effettivi, metadati (attributi personalizzati ecc.) - vedi l'esempio dello spazio dei nomi nella domanda. Inoltre, non voglio aggiungere complessità di implementazione laddove non sia altrimenti necessario. –

+2

Non pensi che il codice sopra sia già complesso?Continuo a pensare che tu stia davvero arrivando a questo da una mentalità C++ e magari manchi alcuni strumenti che offre C#, ma ti auguro buona fortuna di trovare una soluzione che ti renda felice! –

2

Non sono a conoscenza di un preprocessore per C# che consente di esportare un sottoinsieme del codice sorgente senza crearlo.

Tuttavia, si dovrebbe essere in grado di ottenere lo stesso effetto utilizzando un modello di generazione del codice. Basta passare alle direttive del preprocessore per l'equivalente modello appropriato.

Visual Studio 2008 ha uno strumento di generazione codice incorporato denominato T4. Ci sono altre opzioni di terze parti come CodesmithTools o la libera MyGeneration.Net

+1

Sembra promettente - Non avevo pensato a T4 - Lo esaminerò e riporto presto .. –

2

Io non credo che ci siano bandiere per la CSC o msc (compilatore mono) per l'output dei file già preparati.

Se avessi dovuto fare questo, ed era un piccolo sottoinsieme, avrei compilato e quindi usato Reflector per decompilare nuovamente in C# ed esportare i file. Se disponi di molti file, esiste un numero Reflector Add-In chiamato FileGenerator for Reflector.

Sfortunatamente questa non sarà una copia fedele del codice base - riformatterà tutto il codice e perderete tutti i commenti.

Problemi correlati