У меня есть проект Visual Studio C ++, который использует внешний файл DLL. Как я могу заставить Visual Studio автоматически копировать этот файл DLL в выходной каталог (отладка / выпуск) при сборке проекта?
102
У меня есть проект Visual Studio C ++, который использует внешний файл DLL. Как я могу заставить Visual Studio автоматически копировать этот файл DLL в выходной каталог (отладка / выпуск) при сборке проекта?
Используйте в проекте действие после сборки и добавьте команды для копирования вредоносной библиотеки DLL. Действия после сборки записываются как пакетный сценарий.
На выходной каталог можно ссылаться как на $(OutDir)
. Каталог проекта доступен как $(ProjDir)
. Попробуйте использовать относительные пути, где это возможно, чтобы вы могли копировать или перемещать папку проекта, не нарушая действия после сборки.
$ (OutDir) оказался относительным путем в VS2013, поэтому мне пришлось объединить его с $ (ProjectDir) для достижения желаемого эффекта:
Кстати, вы можете легко отлаживать сценарии, добавляя «echo» в начале и наблюдая за развернутым текстом в окне вывода сборки.
источник
Подробности в разделе комментариев выше не помогли мне (VS 2013) при попытке скопировать выходную dll из одного проекта C ++ в папку выпуска и отладки другого проекта C # в том же решении.
Мне пришлось добавить следующее действие после сборки (щелкните правой кнопкой мыши проект с выходом .dll), затем свойства -> свойства конфигурации -> события сборки -> событие после сборки -> командная строка
теперь я добавил эти две строки, чтобы скопировать выходную dll в две папки:
источник
(Этот ответ относится только к C #, а не к C ++, извините, я неправильно прочитал исходный вопрос)
Я уже проходил через ад DLL вот так раньше. Мое последнее решение заключалось в том, чтобы хранить неуправляемые библиотеки DLL в управляемой библиотеке DLL в виде двоичных ресурсов, извлекать их во временную папку при запуске программы и удалять их при удалении.
Это должно быть частью .NET или инфраструктуры pinvoke, поскольку это очень полезно ... Это упрощает управление вашей управляемой DLL как с помощью Xcopy, так и в качестве ссылки на проект в более крупном решении Visual Studio. Как только вы это сделаете, вам не придется беспокоиться о событиях после сборки.
ОБНОВИТЬ:
Я разместил код здесь в другом ответе https://stackoverflow.com/a/11038376/364818
источник
Добавьте встроенную копию в файл project.csproj :
источник
Вы также можете указать относительный путь, следующий пример найдет DLL в папке, расположенной на один уровень выше папки проекта. Если у вас есть несколько проектов, которые используют DLL в одном решении, это помещает источник DLL в общую область, доступную при установке любого из них в качестве Startup Project.
В
/y
опционные копии без подтверждения. Эта/d
опция проверяет, существует ли файл в целевом объекте, и копирует ли он, только если у источника более новая временная метка, чем у цели.Я обнаружил, что по крайней мере в более новых версиях Visual Studio, таких как VS2109,
$(ProjDir)
не определено и пришлось использовать$(ProjectDir)
вместо него.Если не указывать целевую папку, по
xcopy
умолчанию должен использоваться выходной каталог. Важно понимать, что сам по$(OutDir)
себе разум бесполезен.$(OutDir)
, по крайней мере, в последних версиях Visual Studio, определяется как относительный путь к выходной папке, напримерbin/x86/Debug
. Использование только его в качестве цели создаст новый набор папок, начиная с выходной папки проекта. Пример:… bin/x86/Debug/bin/x86/Debug
.Объединение его с папкой проекта должно привести вас в нужное место. Пример:
$(ProjectDir)$(OutDir)
.Однако
$(TargetDir)
предоставит выходной каталог за один шаг.Список макросов MSBuild от Microsoft для текущей и предыдущих версий Visual Studio
источник