it-roy-ru.com

Как заставить Visual Studio разрешить и включить все зависимости моего проекта во время сборки?

У меня есть большое решение в настоящее время под VS2010, с большим количеством проектов и зависимостей. Некоторые из них установлены в GAC, некоторые просто включены из папки "lib". Мне нужно создать один из моих проектов (в частности, приложение WinForms), чтобы он мог работать на любых компьютерах, не относящихся к разработке, без какого-либо процесса установки (кроме, конечно, среды выполнения .NET), как это делают портативные приложения.

Чтобы это работало, мне нужно иметь все библиотеки DLL со ссылками и их целое дерево зависимостей в выходной папке моего EXE-файла. Я могу сделать это для примера, пометив зависимости как «Копировать локальные» в окне свойств, но это работает только для прямых ссылок на проект EXE, поэтому этого недостаточно. Другой способ - создать проект установки, но мой клиент, а также я хочу этого избежать (в финальной версии я собираюсь использовать ClickOnce). Конечно, я всегда могу сделать это вручную, собирая все библиотеки DLL вручную, но это настоящий кошмар.

Есть ли какой-нибудь инструмент, трюк с msbuild, опция командной строки, какой-нибудь хакер, чтобы заставить Visual Studio собрать все дерево зависимостей моего EXE-файла во время сборки и скопировать их в выходную папку? Чтобы я мог просто собрать все вместе и отправить моему клиенту.

21
Zoltán Tamási

Я на самом деле выбрал несколько «среднее» решение, следующим образом.

  1. Я создал «фиктивный» проект установки, не заботясь о настройке чего-либо, а добавляя выходные данные проекта (основной вывод, локализованные ресурсы, содержимое и т.д.). Это была двухминутная задача.
  2. Я построил проект установки и получил файл MSI в качестве вывода.
  3. Я извлек содержимое файла MSI в определенную папку, которая называется, например, «MyAppPortable». Я нашел решение здесь . Команда командной строки

    msiexec/a "absolute_path_to_my_MSI_output"/qb TARGETDIR = "absolute_path_to_my_desired_output_folder"

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

1
Zoltán Tamási

По сути, используя Visual Studio, вы можете настроить все свои проекты Solution для встраивания в одну папку Output и использовать эту папку в качестве папки приложения Windows Form (в которой будет находиться EXE-файл приложения).

Делая это, вы будете координировать все возможные ссылки на сборки, от которых зависит ваше приложение.

В VS 2012 щелкните правой кнопкой мыши Project => Properties => Select Build (левая панель) => Установите выходной путь:

Output path in VS 2012

Я бы выбрал папку уровня решения как Выходной путь.

И если запрещено выполнять такую ​​модификацию на вашем рабочем месте, я бы посоветовал вам использовать инструменты анализа зависимостей, подобные следующим, для опроса и сбора соответствующих сборок, от которых зависит ваше приложение и которые потребуются во время выполнения:

Обновление:

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

1
Yair Nevet

Ознакомьтесь с рекомендациями Fody/Costura по этому вопросу: Встраивание DLL в скомпилированный исполняемый файл

Это великолепно! Я просто попробовал его для аналогичной необходимости, и менее чем через несколько минут у меня был полностью переносимый (кроме .Net framework) exe, который я мог бы легко дать коллегам.

0
Matt Penner