Как заставить Visual Studio копировать DLL файл в выходной каталог?

У меня есть проект Visual Studio С++, который опирается на внешний DLL файл. Как я могу заставить Visual Studio копировать этот DLL файл автоматически в выходной каталог (debug/release) при создании проекта?

Ответ 1

Используйте действие post-build в вашем проекте и добавьте команды для копирования повреждающей DLL. Действие после сборки записывается как пакет script.

В выходной каталог можно указать $(OutDir). Каталог проекта доступен как $(ProjDir). Попробуйте использовать относительные патчи, где это применимо, чтобы вы могли скопировать или переместить папку проекта, не нарушив действие после сборки.

Ответ 2

$(OutDir) оказался относительным путем в VS2013, поэтому мне пришлось объединить его с $(ProjectDir) для достижения желаемого эффекта:

xcopy /y /d  "$(ProjectDir)External\*.dll" "$(ProjectDir)$(OutDir)"

Кстати, вы можете легко отлаживать сценарии, добавляя "echo" в начале и наблюдая расширенный текст в окне вывода сборки.

Ответ 3

Детали в разделе комментариев выше не работали для меня (VS 2013) при попытке скопировать выходную DLL из одного проекта С++ в папку выпуска и отладки другого проекта С# в рамках одного и того же решения.

Мне пришлось добавить следующее пост-действие (щелкните правой кнопкой мыши на проекте с выходом .dll), затем свойства → свойства конфигурации → события сборки → событие после сборки → командная строка

теперь я добавил эти две строки, чтобы скопировать выходную dll в две папки:

xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Release
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Debug

Ответ 4

(Этот ответ применим только к С#, а не С++, извините, что я неправильно понял исходный вопрос)

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

Это должно быть частью инфраструктуры .NET или pinvoke, поскольку это так полезно... Это упрощает управление вашей управляемой DLL, используя Xcopy или ссылку на проект в более крупном решении Visual Studio. Когда вы это сделаете, вам не придется беспокоиться о событиях после сборки.

UPDATE:

Я написал код здесь в другом ответе fooobar.com/questions/16728/...

Ответ 5

xcopy /y /d  "$(ProjectDir)External\*.dll" "$(TargetDir)"

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

xcopy /y /d  "$(ProjectDir)..\External\*.dll" "$(TargetDir)"

Параметр /y копируется без подтверждения. Параметр /d проверяет, существует ли файл в целевом объекте и копирует ли он только в том случае, если источник имеет более новую временную метку, чем целевой.

Я обнаружил, что по крайней мере в более новых версиях Visual Studio, таких как VS2109, $(ProjDir) не определен, и вместо него пришлось использовать $(ProjectDir).

Выход из целевой папки в xcopy должен по умолчанию использовать выходной каталог. Важно понимать, что $(OutDir) себе причина $(OutDir) не помогает.

$(OutDir), по крайней мере в последних версиях Visual Studio, определяется как относительный путь к выходной папке, такой как bin/x86/Debug. Использование одного только в качестве цели создаст новый набор папок, начиная с выходной папки проекта. Пример: … bin/x86/Debug/bin/x86/Debug.

Комбинируя его с папкой проекта, вы попадете в нужное место. Пример: $(ProjectDir)$(OutDir).

Однако $(TargetDir) предоставит выходной каталог за один шаг.

Microsoft список макросов MSBuild для текущей и предыдущих версий Visual Studio