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