2009-06-12 17 views
5

Kennt jemand ein Dienstprogramm, um eine C# -Quelldatei ohne Kompilierung vorzuverarbeiten, ähnlich wie bei der Verwendung des -E-Flags in GCC? Ich habe versucht, GCC - es erfolgreich verarbeitet #if Richtlinien, aber es Drosseln auf allen #region Richtlinien ...Existiert ein C# -Preprocessing-Tool?

Idealerweise ich möchte in der Lage sein, das Werkzeug über eine CS-Datei laufen alle #if Blöcke zu entfernen, die zu bewerten auf false, und Flag optional können, ob intakt Kommentare, #region, #pragma Richtlinien usw.

um dies zu, ich möchte in der Lage sein, in Zusammenhang zu bringen, um eine gewisse Quellcode veröffentlichen, die Teil einer zu entfernen/verlassen ist (viel) größeres Projekt, während Teile entfernt werden, die nur für das größere Projekt relevant sind. Als Beispiel gibt es Teile des Codes, die wie folgt aussehen:

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

Bitte denken Sie daran Ich versuche nicht, baut hier zu tun - das ist rein über nur einen Teil eines größeren Projekts, den Quellcode zu veröffentlichen.

Irgendwelche Ideen/Hilfe geschätzt.

Antwort

3

Es stellt sich heraus, mit dem GNU C Preprocessor (cpp) direkt (anstatt über gcc) bietet mehr Kontrolle über die Ausgabe. Mit dieser konnte ich die Quelldateien in einer geeigneten Weise verarbeiten ...

Hier ein Beispiel:

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

Ich versuchte, die C/C++ Compiler mit Visual Studio zur Verfügung gestellt, um etwas ähnliches zu tun , gab aber nach einer Weile auf ...

+0

Woher bekomme ich die ausführbare Datei? – NightOwl888

+0

Es ist Teil der GNU-Compiler-Sammlung - es ist wahrscheinlich bereits installiert, wenn Sie OS X oder Linux ausführen. Wenn Sie Windows verwenden, ist MinGW wahrscheinlich das, was Sie brauchen. –

+0

Ich fand eine, die hier funktioniert: http://mcpp.sourceforge.net/download.html, aber die ausführbare Datei ist MCPP und nicht cpp. – NightOwl888

1

Wäre es nicht einfacher und idiomatischer C#, um Schnittstellen zu erstellen und verschiedene Implementierungen dieser Schnittstellen zu haben? Ein Satz, den Sie als Bibliothek einpacken und neu verteilen können?

+0

Ich muss in der Lage sein, tatsächliche Klassen-/Namespacenamen, Metadaten (benutzerdefinierte Attribute usw.) zu verarbeiten - siehe das Namespace-Beispiel in der Frage. Ich möchte auch nicht die Implementierungskomplexität hinzufügen, wo sie sonst nicht benötigt wird. –

+2

Sie denken nicht, dass der obige Code bereits komplex ist?Ich denke immer noch, dass Sie wirklich von einer C++ Denkweise kommen und vielleicht einige Tools verpassen, die C# bietet, aber viel Glück finden Sie eine Lösung, die Sie glücklich machen wird! –

2

Mir ist kein Präprozessor für C# bekannt, mit dem Sie eine Teilmenge Ihres Quellcodes exportieren könnten, ohne sie zu erstellen.

Sie sollten jedoch den gleichen Effekt erzielen können, indem Sie eine Codegenerierungsvorlage verwenden. Wechseln Sie einfach zu den Preprocesor-Direktiven für das entsprechende Template-Äquivalent.

Visual Studio 2008 verfügt über ein integriertes Codegenerierungstool mit der Bezeichnung T4. Es gibt andere Optionen von Drittanbietern wie CodesmithTools oder die freie MyGeneration.Net

+1

Das hört sich vielversprechend an - ich hatte nicht über T4 nachgedacht - ich werde mich darum kümmern und bald darüber berichten. –

2

Ich glaube nicht, dass es irgendwelche Flags für die csc oder msc (Mono-Compiler), um die vorverarbeiteten Dateien.

Wenn ich dies tun musste, und es war eine kleine Teilmenge, die ich kompilieren würde und dann Reflector verwenden, um zurück zu C# zu dekompilieren und die Dateien zu exportieren. Wenn Sie viele Dateien haben, gibt es eine Reflector Add-In namens FileGenerator for Reflector.

Leider wird dies keine echte Kopie Ihrer Codebasis sein - es wird den gesamten Code neu formatieren und Sie werden alle Kommentare verlieren.

Verwandte Themen