2009-06-12 14 views
5

Czy ktoś wie o narzędziu do wstępnego przetworzenia pliku źródłowego C# bez kompilowania go, podobnie jak przy użyciu flagi -E w GCC? Próbowałem za pomocą GCC - z powodzeniem przetwarza #if dyrektyw, ale dławiki na wszelkich #region dyrektyw ...Czy istnieje narzędzie do przetwarzania wstępnego C#?

Idealnie, chciałbym być w stanie uruchomić narzędzie nad plikiem .cs aby usunąć bloki, które oceniają #if do fałszu i opcjonalnie można oznaczyć, czy usunąć/pozostawić nietknięte komentarze, #region, dyrektyw itp.

Aby umieścić to w kontekście, chcę mieć możliwość opublikowania kodu źródłowego, który jest częścią (dużo) większy projekt, usuwając fragmenty, które są istotne tylko dla większego projektu. Jako przykład, istnieją fragmenty kodu, które wyglądają tak:

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

Proszę pamiętać, że nie staram się robić buduje tutaj - to jest wyłącznie o publikowanie tylko część kodu źródłowego większego projektu.

Wszelkie pomysły/pomoc doceniane.

Odpowiedz

3

Okazuje się, że za pomocą preprocesora GNU C (cpp) bezpośrednio (a nie za pomocą gcc) zapewnia większą kontrolę nad wyjściem. Korzystanie z tego, że jestem w stanie przetwarzać pliki źródłowe w odpowiedni sposób ...

Oto przykład:

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

Próbowałem dostać/C++ kompilator C realizowana z Visual Studio, aby zrobić coś podobnego , ale zrezygnował po pewnym czasie ...

+0

Gdzie mogę uzyskać plik wykonywalny? – NightOwl888

+0

Jest to część kolekcji kompilatora GNU - prawdopodobnie jest już zainstalowana, jeśli używasz systemu OS X lub Linux. Jeśli używasz systemu Windows, MinGW jest prawdopodobnie tym, czego potrzebujesz. –

+0

Znalazłem jeden, który działa tutaj: http://mcpp.sourceforge.net/download.html, ale plik wykonywalny to mccp zamiast cpp. – NightOwl888

1

Czy to nie będzie łatwiejsze i bardziej idiomatyczne C#, tworzenie interfejsów i różne implementacje tych interfejsów? Jeden zestaw, który można spakować jako bibliotekę i rozpowszechniać?

+0

Potrzebuję być w stanie przetworzyć rzeczywistą nazwę klasy/przestrzeni nazw, metadane (niestandardowe atrybuty itp) - patrz przykład przestrzeni nazw w pytaniu. Nie chcę też dodawać złożoności implementacji tam, gdzie nie jest to potrzebne. –

+2

Nie uważasz, że powyższy kod jest już skomplikowany?Nadal uważam, że naprawdę przychodzisz do tego z myślenia w C++ i może brakuje Ci narzędzi, które oferuje C#, ale powodzenia w znalezieniu rozwiązania, które sprawi, że będziesz szczęśliwy! –

2

Nie jestem świadomy preprocesora dla C#, który pozwoliłby wyeksportować podzbiór kodu źródłowego bez jego budowania.

Jednakże, powinieneś być w stanie osiągnąć ten sam efekt za pomocą szablonu generowania kodu. Wystarczy zmienić dyrektywę preprocesora na odpowiedni odpowiednik szablonu.

Visual Studio 2008 ma wbudowane narzędzie do generowania kodu o nazwie T4. Istnieją inne opcje innych firm, takich jak CodesmithTools lub swobodnego MyGeneration.Net

+1

Brzmi obiecująco - nie myślałem o T4 - zajrzę do tego i wkrótce się zgłoszę. –

2

Nie wierzę, że istnieją jakieś flagi dla kompilatora (mono) csc lub msc wyprowadzania przetworzonych plików.

Gdybym musiał to zrobić, a był to niewielki podzbiór, skompilowałem, a następnie użyłem Reflector do dekompilacji z powrotem do C# i wyeksportowania plików. Jeśli masz dużo plików, istnieje Reflector Add-In o nazwie FileGenerator for Reflector.

Niestety nie będzie to prawdziwa kopia Twojego kodu - zmieni to cały kod, a stracisz wszystkie komentarze.

Powiązane problemy