Как включить необходимые файлы в вывод независимого клиентского проекта?


Мое решение состоит из:

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 8

3 ответа:

Добавить существующий элемент в виде ссылки:

У меня была похожая проблема в VS2010, и я вроде как закончил тем, что добавил файл как Link и обновил его свойство до Copy Always.

В вашем случае в проекте CLIENT Добавьте ThirdParty.dll as Link (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 on MSBuild, вы можете обратиться к файлу 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">

Это легко, и странно, что это не сработало для вас. Я только что проверил, и это работает:

  1. добавьте ThirdParty.dll в проект Lib.
  2. значение Build Action должно быть равно Content (значение по умолчанию) !!!
  3. установить Copy to Output Directory в Copy if newer или Copy always
  4. Ссылка Lib из App
  5. Ссылка 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

Возможно, вам нужно будет сначала "построить" - > "перестроить решение".