2009-06-12 4 views
5

Кто-нибудь знает утилиту для предварительной обработки исходного файла C# без ее компиляции, аналогично использованию флага -E в GCC? Я попытался с помощью GCC - он успешно обрабатывает #if директивы, но давится любые #region директив ...Имеется ли препроцессор C#?

В идеале я хотел бы иметь возможность запускать инструмент на файл .cs, чтобы удалить любые #if блок, которые оценивают на false и необязательно указывать, следует ли удалять/оставлять неповрежденные комментарии, #region, #pragma и т. д.

Чтобы выразить это в контексте, я хочу, чтобы иметь возможность опубликовать некоторый исходный код, который является частью (много) более крупный проект, в то время как удаление частей, которые имеют отношение только к более крупному проекту. В качестве примера, есть куски кода, которые выглядят так:

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

Пожалуйста, помните, я не пытаюсь делать строит здесь - это чисто о публикации только подмножество исходного кода Большего проекта.

Любые идеи/помощь оценили.

ответ

3

Оказывается, использование препроцессора GNU C (cpp) напрямую (а не через gcc) обеспечивает больший контроль над выходом. Используя это, я был в состоянии обработать исходные файлы подходящим образом ...

Вот пример:

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

Я пытался получить/C++ компилятор C снабженное Visual Studio, чтобы сделать что-то подобное , но сдался через некоторое время ...

+0

Где я могу получить исполняемый файл? – NightOwl888

+0

Это часть коллекции компиляторов GNU - она, вероятно, уже установлена, если вы используете OS X или Linux. Если вы используете Windows, MinGW - это то, что вам нужно. –

+0

Я нашел тот, который работает здесь: http://mcpp.sourceforge.net/download.html, но исполняемый файл - mccp, а не cpp. – NightOwl888

1

Возможно, вам не проще и более идиоматично C# создавать интерфейсы и иметь разные реализации этих интерфейсов? Один набор, который вы можете упаковать как библиотеку и перераспределить?

+0

Мне нужно иметь возможность обрабатывать фактические имена классов/имен, метаданные (настраиваемые атрибуты и т. Д.) - см. Пример пространства имен в вопросе. Я также не хочу добавлять сложность реализации, где это не требуется. –

+2

Вы не думаете, что вышеуказанный код уже сложный? Я все еще думаю, что вы действительно придумываете это из менталитета C++ и, возможно, не хватает некоторых инструментов, которые предлагает C#, но, к счастью, найти решение, которое сделает вас счастливыми! –

2

Я не знаю препроцессора для C#, который позволит вам экспортировать подмножество исходного кода, не создавая его.

Тем не менее, вы можете добиться такого же эффекта, используя шаблон генерации кода. Просто измените директивы preprocesor на соответствующий эквивалент шаблона.

Visual Studio 2008 имеет встроенный инструмент для создания кода под названием T4. Есть и другие варианты третьих сторон, как CodesmithTools или свободного MyGeneration.Net

+1

Это звучит многообещающе - я не думал о T4 - я загляну в него и скоро отчитаюсь .. –

2

Я не верю, что есть какие-то флаги для CSC или MSc (моно компилятора) для вывода препроцессированных файлов.

Если бы мне пришлось это сделать, и это было небольшое подмножество, которое я бы скомпилировал, а затем использовал Reflector, чтобы декомпилировать обратно на C# и экспортировать файлы. Если у вас много файлов, есть Reflector Add-In по номеру FileGenerator for Reflector.

К сожалению, это не будет подлинная копия вашей кодовой базы - она ​​переформатирует весь код, и вы потеряете все комментарии.

Смежные вопросы