Использование препроцессора C # для добавления ссылки - PullRequest
1 голос
/ 11 августа 2009

У меня есть большое приложение, которое я могу построить через командную строку. Я хочу указать флаг, который позволит мне скомпилировать его в один из двух режимов: Актуальный или Симулированный.

Итак, основная проблема в том, как я могу использовать препроцессор для программного добавления ссылки?

Например:

#if SIMULATED
    include SimulatedFiles;
    myFactory = new SimulatedFiles.simFactory();
#else
    myFactory = new realFactory();
#endif

Я не хочу, чтобы какие-либо смоделированные файлы компилировались в мое "реальное" приложение. Поскольку в C # нет директивы include, я застрял в том, как этого добиться.

Ответы [ 4 ]

10 голосов
/ 11 августа 2009

Вы не можете сделать это с помощью оператора препроцессора C #, потому что язык не поддерживает понятие ссылок через макросы препроцессора.

Что вы можете сделать, это использовать файл msbuild и изменить набор ссылок, добавленных на основе параметров msbuild.

4 голосов
/ 11 августа 2009

nant / msbuild и инструмент для внедрения зависимостей с конфигурацией xml?

1 голос
/ 11 августа 2009

Являются ли включаемые файлы вашим собственным исходным кодом или сторонними сборочными библиотеками?

Если они являются вашими собственными источниками, то вы можете легко использовать условную компиляцию для удаления «смоделированного» кода из вашей сборки выпуска, точно так же, как вы это делали в своем примере (просто замените «include» на «using»). Это обычная практика с отладочными классами, например.

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

(Другая возможность, которая кажется менее полезной для вас, - это написание «фиктивной» версии ссылочной сборки, которую вы отправляете вместо «настоящей», или прокси, который вызывает реальную стороннюю dll в симулированных сборках Только если он предоставляет открытые классы и методы, которые вы вызываете, вы можете отправить пустышку вместо смоделированной сборки вашим клиентам)

1 голос
/ 11 августа 2009

В C # нет реального препроцессора, как вы можете прочитать в документации C # препроцессора .

Из документации (выделено мое):

Хотя компилятор не имеет отдельного препроцессора , описанные в этом разделе директивы обрабатываются так, как если бы они были; эти директивы используются для помощи в условной компиляции. В отличие от директив C и C ++, вы не можете использовать эти директивы для создания макросов .

...