Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Настройка подключенных «References» к проекту С#


Автор: DigitalDummy 14.7.2008, 15:35
Здоровья вам, и разуменья, грандиозные умы форума Винград!

Есть ли возможность, каким-то образом задавать для проекта список References, если часто нужно туда подключать\отключать какой-то один элемент (из своего набора) чтобы просто «сбилдить» несколько разных версий одной программы?

Например, я вижу крайне удобным решением (если такое возможно) создать несколько конфигураций проекта. Это там, где изначально обычно только «Debug» и «Release», я бы добавил себе «Release (with Lib_A)», «Release (with Lib_B)» и так далее. (В С++ проектах у меня уже было такое решение и там различался набор «дефайнов» препроцессора или набор *.lib подключений.)

Все это надо провернуть в рамках среды Visual Studio. Если задал вопрос не в тот раздел форума, то прошу прощения у модераторов.

Дополнение темы:
Основной проект постоянно меняется (дополняется новыми модулями, файлами ресурсов и т.д.). Создавать несколько разных его копий, отличающихся только списком подключенных References гораздо сложнее в обновлении, чем в ручную их менять у одной копии проекта. Так что, вариант с разными копиями основного проекта не подходит. Спасибо, http://vingrad.ru/@Partizan за первое предложенное решение и развитие темы.

На данный момент у меня следующие возможные идеи:
  •  Использовать компилятор через командную строку для сборки проекта (с параметрами, если такие есть, использования References подключений).
  •  Править файл проекта (он вроде бы в формате XML) с помощью своей небольшой утилиты. Потом запускать компиляцию через командную строку.
  •  Использовать встроенные в Visual Studio макросы (на Visual Basic), чтобы проводить изменения проекта в один клик.

Может быть эти идеи вам помогут, чтобы помочь мне.

Большое спасибо за любую помощь и советы.

Автор: Partizan 14.7.2008, 17:27
DigitalDummy, не знаю как в рамках среды....а вот созданием нескольких вариаций одного и того же *.csproj файла я думаю эту задачу решить можно...

Автор: DigitalDummy 14.7.2008, 17:37
Спасибо за ответ, Partizan,
Это решение не подходит. Основной проект постоянно меняется (дополняется новыми модулями, файлами ресурсов и т.д.). Создавать несколько разных его копий, отличающихся только списком подключенных References гораздо сложнее в обновлении, чем в ручную их менять у одной копии проекта. (Обновил описание темы в соответствие с этим условием.)

Автор: Partizan 14.7.2008, 18:06
DigitalDummy, ну когда я  говорил про несколько копий *csproj - это решение тоже подразумевалось как возможное smile

Цитата

Править файл проекта (он вроде бы в формате XML) с помощью своей небольшой утилиты. Потом запускать компиляцию через командную строку.


Добавлено через 7 минут и 36 секунд
DigitalDummy, как ещё один вариант(в продолжение варианта с правкой файла проекта с помощью утилиты):
1. пусть улитита правит файл проекта в зависимости допустим от аргументов командной строки
2. пусть затем запускает msbuild.exe и собирает проект в нужной конфигурации
3. пусть утилита затем восстанавливает файл проекта в исходное состояние

4. это всё можно затем прописать в качестве prebuild/postbuild events разных конфигураций...

чуть по-извращенски, но всё же =)

Автор: jonie 14.7.2008, 19:41
грузите сборки динамически 8)
а так стандартными методами vs низя вроде как

Автор: DigitalDummy 14.7.2008, 23:25
Спасибо, jonie, за попытку. Динамически грузить мне тоже не подходит. Мне нужен готовый продукт в нескольких вариациях. Без всякого лишнего.

Спасибо, Partizan, за извращенческий вариант.

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

В оболочке Visual Studio есть знакомые всем определения: Solution и Project.
Solution, говоря в общих чертах, просто объединяет в себе группу из одного и более Проектов (Project). Проект, в свою очередь, уже несет в себе ссылки на исходные файлы, файлы ресурсов, настройки компиляции, сборки и прочее. То есть, всю лабудень, которая нужна для великого процесса создания исполняемого файла (библиотеки или прочей чертовщины — ну, вы меня поняли).

Проект сам по себе является текстовым XML файлом с набором свойств и параметров проекта. Здесь и ссылки на исходные файлы, и просто настройки проекта.

Ну, а одна из главных прелестей оболочки Visual Studio в том, что она все-таки предоставляет возможность разработчику иметь для каждого Проекта (и для «Солюшена» тоже), набор конфигураций. Ну, там, «Debug», «Release». Понимаем? Ага.

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

Ход событий:

1) Как добавить новую «конфигурацию», я рассказывать здесь не буду. Это все и так уже должны знать, потому что это все делается через интерфейс Visual Studio. Скажу только, что я добавил в свой основной проект конфигурацию с идентификатором «Release.Ref.1».

2) Теперь, я вручную добавил нужный мне «Reference» к своему основному проекту. Как если бы я собирался «сбилдить» один из нужных вариантов моей программы.

3) Но, «билдить» я больше не хочу как обычно, вручную меняя «Reference» список. Надоело! Сохраняю все изменения и закрываю студию.

4) Нахожу свой файл Проекта и открываю в обычном текстовом редакторе.

5) Ищу следующий набор параметров:
Код

    <ItemGroup>
      <ProjectReference Include="..\MyProject_Ref_1\MyProject_Ref_1.csproj">
        <Project>{здесь гуид вашего проекта «референса»}</Project>
        <Name>MyProject_Ref_1</Name>
      </ProjectReference>
    </ItemGroup>

Именно этот набор параметров отвечает за подключение к моему проекту другого моего проекта как «Reference». Для примера, подключаемый проекта тут называется «MyProject_Ref_1».

6) И тут, я, начитавшись перед этим документации, самым магическим образом редактирую данный набор параметров в следующую конструкцию:
Код

  <!-- My very own magically edited custom project properties : Begin -->
  <Choose>
    <When Condition=" '$(Configuration)'=='Release.Ref.1' ">
      <ItemGroup>
      <ProjectReference Include="..\MyProject_Ref_1\MyProject_Ref_1.csproj">
        <Project>{здесь гуид вашего проекта «референса»}</Project>
        <Name>MyProject_Ref_1</Name>
      </ProjectReference>
      </ItemGroup>
    </When>
  </Choose>
  <!-- My very own magically edited custom project properties : End -->


С помощью этой конструкции параметров я получаю настраиваемый «билд» проекта только при активной конфигурации проекта с идентификатором «Release.Ref.1». Практически любые параметры проекта (не только список «референсов») можно задавать таким образом. Проект будет отлично открываться в студии как обычный (если, конечно, не ошибиться в синтаксисе). Это дает богатые возможности для автоматизации труда разработчика. Примите мой совет, кто ещё не знает.

Вуаля, господа! Всем спасибо.

P.S. Можно было бы ещё рассказать как я написал «*.bat» файл для «билда» всех вариантов каждой нужной конфигурации моего «Солюшена». Но, это уже гораздо проще и в рамки данной темы не входит.

P.P.S.S. Читаем справку, господа, проявляем внимание и выдержку, и жизнь станет успешнее. Дополнительную информацую искать тут:

Для расширенных параметров проекта:
MSDN, Раздел «MSBuild Conditional Constructs»

Для «билда» с помощью «батника»: 
MSDN, Раздел «Devenv Command Line Switches»

Автор: Idsa 15.7.2008, 00:20
DigitalDummy, не нравится мне Ваш тон :(
А решение отличное. Это плюс.

Автор: DigitalDummy 15.7.2008, 00:42
Idsa, прошу простить коль что-то вам не понравилось в тоне.

Пишу ровно так, как приятно и весело было бы услышать это всё мне самому. Вот был бы я клоном самого себя, ровно так бы и зачитался с восторгом.

Простите!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)