Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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, который я мог бы легко предоставить коллегам.