Как включить необходимые файлы в вывод независимого клиентского проекта?
Мое решение состоит из:
Client
- стартовый проект, слой пользовательского интерфейса. Зависит от: App
App
- библиотека, прикладной уровень, ассемблер. Зависит от: Lib1
, ...
Lib1
- библиотека, уровень бизнес-логики. Нужен конкретный файл для правильной работы: ThirdParty.dll
Я добавил ThirdParty.dll
в проект Lib1
(Add
> Existing Item...
> Add
) и установите свойство Copy to Output Directory
dll-файла в Copy Always
. Теперь файл dll копируется на выход Lib1
и на выход App
, но не на выход Client
выводите там, где мне нужно.
Что такое правильный (простой? очевидно?) способ копирования ThirdParty.dll
на выход Client
при каждой сборке решения?
UPD
ThirdParty.dll
не является ссылкой. На самом деле, это еще одна референтная зависимость. Мой вопрос применяется к любому файлу, который должен быть в папке запущенного приложения.
Записал видео, чтобы убедиться, что я все делаю правильно: http://youtu.be/QwS2tOIc5yQ
3 ответа:
Добавить существующий элемент в виде ссылки:
У меня была похожая проблема в
VS2010
, и я вроде как закончил тем, что добавил файл какLink
и обновил его свойство доCopy Always
.В вашем случае в проекте
CLIENT
ДобавьтеThirdParty.dll
asLink
(Add > Existing Item > Add as Link) и установите свойствоCopy to Output Directory
dll-файла вCopy Always
. Примечание : он будет копировать иерархию папок из узла проекта.просто для справки: я на самом деле использовал открытый исходный код LibGit2Sharp которые необходимы библиотеки DLL (libGit2.dll), чтобы быть доступным в выходном каталоге. Поэтому в слое пользовательского интерфейса, который добавил слой приложений, содержащий
LibGit2Sharp.dll
в качестве ссылки; я должен был добавитьlibGit2.dll
в качествеLink
+Copy Always
. Это было рекомендованное решение.Post Build:
Другим вариантом может быть написание сценариев сборки post для
CLIENT
Чтобы узнать, как работает
Copy
onMSBuild
, вы можете обратиться к файлуMicrosoft.Common.targets
(должен быть доступен @ C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets в вашей системе)<Target Name="CopyFilesToOutputDirectory" DependsOnTargets=" ComputeIntermediateSatelliteAssemblies; _CopyFilesMarkedCopyLocal; _CopySourceItemsToOutputDirectory; _CopyAppConfigFile; _CopyManifestFiles; _CheckForCompileOutputs; _SGenCheckForOutputs">
Это легко, и странно, что это не сработало для вас. Я только что проверил, и это работает:
- добавьте
ThirdParty.dll
в проектLib
.- значение
Build Action
должно быть равноContent
(значение по умолчанию) !!!- установить
Copy to Output Directory
вCopy if newer
илиCopy always
- Ссылка
Lib
изApp
- Ссылка
App
изClient
Это работает в Visual Studio 2012, но, похоже, не работает в Visual Studio 2010 год.
VS2010:
Target "AssignTargetPaths" skipped. Previously built successfully. Target "_SplitProjectReferencesByFileExistence" in file "C:\windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets" from project "Test.ContentFiles\App\App.csproj" (target "GetCopyToOutputDirectoryItems" depends on it): Task "ResolveNonMSBuildProjectOutput" skipped, due to false condition; ('$(BuildingInsideVisualStudio)'=='true' and '@(ProjectReferenceWithConfiguration)'!='') was evaluated as ('true'=='true' and ''!=''). Done building target "_SplitProjectReferencesByFileExistence" in project "App.csproj". Target "GetCopyToOutputDirectoryXamlAppDefs" in file "C:\windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Xaml.targets" from project "Test.ContentFiles\App\App.csproj" (target "GetCopyToOutputDirectoryItems" depends on it): Task "AssignTargetPath" Done executing task "AssignTargetPath". Done building target "GetCopyToOutputDirectoryXamlAppDefs" in project "App.csproj". Target "GetCopyToOutputDirectoryItems" in file "C:\windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets" from project "C:\Users\Ark-kum\Documents\visual studio 2010\Projects\Test.ContentFiles\App\App.csproj" (entry point): Task "MSBuild" skipped, due to false condition; ('@(_MSBuildProjectReferenceExistent)' != '' and '$(_GetChildProjectCopyToOutputDirectoryItems)' == 'true' and '%(_MSBuildProjectReferenceExistent.Private)' != 'false' and '$(UseCommonOutputDirectory)' != 'true') was evaluated as ('' != '' and 'true' == 'true' and '' != 'false' and 'false' != 'true'). Task "AssignTargetPath" Done executing task "AssignTargetPath". Done building target "GetCopyToOutputDirectoryItems" in project "App.csproj". Done executing task "MSBuild". Task "AssignTargetPath" Done executing task "AssignTargetPath". Done building target "GetCopyToOutputDirectoryItems" in project "Client.csproj". Target "_CopyOutOfDateSourceItemsToOutputDirectory" in file "C:\windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets" from project "Test.ContentFiles\Client\Client.csproj" (target "_CopySourceItemsToOutputDirectory" depends on it): Building target "_CopyOutOfDateSourceItemsToOutputDirectory" completely. Output file "bin\Debug\FileList.App.txt" does not exist. Task "Copy" Copying file from "Test.ContentFiles\App\FileList.App.txt" to "bin\Debug\FileList.App.txt".
VS2012:
Target "GetCopyToOutputDirectoryItems" skipped. Previously built successfully. Done executing task "MSBuild". Task "AssignTargetPath" Done executing task "AssignTargetPath". Done building target "GetCopyToOutputDirectoryItems" in project "Client.csproj". Target "_CopyOutOfDateSourceItemsToOutputDirectory" in file "C:\windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets" from project "Test.ContentFiles\Client\Client.csproj" (target "_CopySourceItemsToOutputDirectory" depends on it): Building target "_CopyOutOfDateSourceItemsToOutputDirectory" completely. Output file "bin\Debug\FileList.Lib.txt" does not exist. Output file "bin\Debug\FileList.App.txt" does not exist. Task "Copy" Copying file from "Test.ContentFiles\Lib\FileList.Lib.txt" to "bin\Debug\FileList.Lib.txt". Copying file from "Test.ContentFiles\App\FileList.App.txt" to "bin\Debug\FileList.App.txt".
Цитата из .целевые файлы:
============================================================ GetCopyToOutputDirectoryItems Get all project items that may need to be transferred to the output directory. This includes baggage items from transitively referenced projects. It would appear that this target computes full transitive closure of content items for all referenced projects; however that is not the case. It only collects the content items from its immediate children and not children of children. The reason this happens is that the ProjectReferenceWithConfiguration list that is consumed by _SplitProjectReferencesByFileExistence is only populated in the current project and is empty in the children. The empty list causes _MSBuildProjectReferenceExistent to be empty and terminates the recursion. ============================================================
Можно использовать (в visual studio) свойства проекта Lib1 -> события сборки -> командная строка события после сборки.
В поле редактирования "Командная строка события после сборки" введите copy команды, которые будут копировать необходимые файлы в выходную папку клиента. В этом окне редактирования вы можете использовать различные макросы VS (нажмите "Редактировать пост сборки" - > макросы) Вот так:
copy path\to\ThirdParty.dll $(SolutionDir)Client\bin\Debug
Возможно, вам нужно будет сначала "построить" - > "перестроить решение".