Как заставить Visual Studio разрешать и включать все зависимости моего проекта во время сборки?
У меня есть большое решение в настоящее время под VS2010, с большим количеством проектов и зависимостей. Некоторые из них установлены в GAC, некоторые из них только что включены из папки "lib". Мне нужно создать один из моих проектов (в частности, приложение WinForms) для работы на любых компьютерах без разработки без какого-либо процесса установки (за исключением среды выполнения .NET, конечно), как это делают портативные приложения.
Чтобы это работало, мне нужно, чтобы все связанные библиотеки DLL и их все дерево зависимостей в выходной папке моего EXE. Я могу сделать это, например, путем маркировки зависимостей "Копировать локальную" в окне свойств, но это работает только для прямых ссылок на проект EXE, поэтому этого недостаточно. Другой способ - создать проект установки, но мой клиент, а также я хочу этого избежать (в финальной версии я буду использовать ClickOnce). Конечно, я всегда могу сделать это исключительно вручную, собирая все DLL вручную, но это довольно кошмар.
Есть ли какой-нибудь инструмент, трюк msbuild, параметр командной строки, какой бы взломать, чтобы заставить Visual Studio собирать все дерево зависимостей моего EXE во время сборки и копировать их в выходную папку? Чтобы я мог просто объединить все файлы и отправить клиенту.
Ответы
Ответ 1
Я фактически выбрал несколько "среднее" решение, следующим образом.
- Я создал проект установки "dummy", не заботясь о настройке чего-либо, кроме добавления выходов проекта (первичный вывод, локализованные ресурсы, содержимое и т.д.). Это была 2-минутная задача таким образом.
- Я построил проект установки и получил файл MSI в качестве вывода.
-
Я извлек содержимое файла MSI в определенную папку, например, "MyAppPortable". Я нашел решение здесь. Команда командной строки
msiexec/a "absolute_path_to_my_MSI_output" /qb TARGETDIR = "absolute_path_to_my_desired_output_folder"
-
Я получил полное приложение со всеми его разрешенными зависимостями (за исключением зависимостей поздней привязки, но я позаботился о них вручную, добавив их в качестве ссылок на мои проекты). Я мог бы архивировать всю папку, поместить ее на другой компьютер и вуаля, все было хорошо.
Ответ 2
В принципе, используя Visual Studio, вы можете установить все проекты решений в одну и ту же папку вывода и использовать эту папку в качестве папки приложения Windows Form (где будет находиться EXE-приложение приложения).
Посредством этого вы будете координировать все возможные ссылки сборок, от которых зависит ваше приложение.
В VS 2012 щелкните правой кнопкой мыши Project = > Properties = > Select Build (левая панель) = > Задайте свой путь вывода:
![Output path in VS 2012]()
Я бы выбрал папку уровня решения в качестве пути вывода.
И если ему запрещено выполнять такую модификацию на вашем рабочем месте, я предлагаю вам использовать инструменты анализа зависимостей, такие как следующие, чтобы опросить и собрать соответствующие сборки, от которых зависит ваше приложение, и потребует их во время выполнения
Update:
Использование вышеупомянутых инструментов не даст ссылок на узлы, которые являются поздними (во время выполнения), для этого случая вы можете использовать: Fusion ( средство просмотра привязки к сборке)
Ответ 3
Ознакомьтесь с рекомендацией Fody/Costura по этому вопросу:
Вставка DLL файлов в скомпилированный исполняемый файл
Это здорово! Я просто попробовал это для аналогичной потребности, и менее чем за несколько минут у меня был полностью переносимый (кроме .NET Framework) exe, который я мог бы легко предоставить коллегам.