Відповіді:
Використовуйте дію після складання у своєму проекті та додайте команди, щоб скопіювати DLL-файли, що порушують право. Дія після складання записується як пакетний сценарій.
На вихідний каталог можна посилатися як $(OutDir)
. Каталог проектів доступний як $(ProjDir)
. Спробуйте використовувати відносні патчі, де це можливо, щоб ви могли скопіювати або перемістити папку проекту, не порушуючи дії після збирання.
$ (OutDir) виявився відносним шляхом у VS2013, тому мені довелося поєднувати його з $ (ProjectDir), щоб досягти бажаного ефекту:
xcopy /y /d "$(ProjectDir)External\*.dll" "$(ProjectDir)$(OutDir)"
До речі, ви можете легко налагоджувати сценарії, додаючи "ехо" на початку та спостерігаючи за розширеним текстом у вікні виводу збірки.
Деталі в розділі коментарів вище для мене не працювали (VS 2013) при спробі скопіювати вихідний dll з одного проекту C ++ у папку випуску та налагодження іншого проекту C # у межах одного рішення.
Я повинен був додати наступну дію після збирання (правою кнопкою миші на проект, який має вихід .dll), а потім властивості -> властивості конфігурації -> події побудови -> подія після складання -> командний рядок
тепер я додав ці два рядки, щоб скопіювати вихідний dll у дві папки:
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Release
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Debug
(Ця відповідь стосується лише C #, а не C ++, вибачте, що я неправильно прочитав оригінальне запитання)
Я пережив пекло DLL, як це раніше. Моє остаточне рішення полягало в тому, щоб зберігати керовані DLL в керованій DLL як бінарні ресурси та витягувати їх у тимчасову папку, коли програма запускається та видаляти їх, коли вона видаляється.
Це має бути частиною інфраструктури .NET або pinvoke, оскільки це так корисно .... Це робить керовану DLL просту в управлінні, як за допомогою Xcopy, так і в якості посилання на проект у більшому рішенні Visual Studio. Після цього вам не доведеться турбуватися про події після збирання.
ОНОВЛЕННЯ:
Я розмістив тут код в іншій відповіді https://stackoverflow.com/a/11038376/364818
Додати вбудований COPY у файл project.csproj :
<Project>
...
<Target Name="AfterBuild">
<Copy SourceFiles="$(ProjectDir)..\..\Lib\*.dll" DestinationFolder="$(OutDir)Debug\bin" SkipUnchangedFiles="false" />
<Copy SourceFiles="$(ProjectDir)..\..\Lib\*.dll" DestinationFolder="$(OutDir)Release\bin" SkipUnchangedFiles="false" />
</Target>
</Project>
xcopy /y /d "$(ProjectDir)External\*.dll" "$(TargetDir)"
Ви також можете посилатися на відносний шлях, наступний приклад знайде DLL у папці, розташованій на одному рівні над папкою проекту. Якщо у вас є кілька проектів, які використовують DLL в одному рішенні, це ставить джерело DLL в загальну область, доступну, коли ви встановлюєте будь-який з них як проект запуску.
xcopy /y /d "$(ProjectDir)..\External\*.dll" "$(TargetDir)"
У /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