Сборка в GAC не копируется в вывод в проекте, который ссылается на проект, который ссылается на сборку GAC с CopyLocal = true - PullRequest
14 голосов
/ 24 ноября 2011

У меня есть «Проект A», который ссылается на System.Web.Mvc с CopyLocal = TRue. System.Web.Mvc находится в GAC как на моей локальной машине, так и на сервере сборки.

У меня также есть «Проект B», который ссылается на «Проект A» в выходных данных для «Проекта B» System.Web.Mvc не копируется во время сборки.

Я подозреваю, что это потому, что это в GAC. Это правда? И можно ли что-то сделать, чтобы MSBuild скопировал это в выходную папку?

Я прочитал ответ от Muse VsExtensions в этой теме, где говорится только о прямой ссылке на GAC, однако у нас есть косвенная ссылка через «Проект A»: .NET Reference «Копировать локально» Установлено верно / неверно на основе содержимого GAC

Этот пост также связан с: http://deeperdesign.wordpress.com/2010/02/08/msbuild-assembly-dependencies-and-the-gac/

Ответы [ 3 ]

7 голосов
/ 24 ноября 2011

Вы проверяли файл .csproj, чтобы убедиться, что ссылка действительно содержит тег <Private>True</Private>? Копия локальная, к сожалению, имеет 3 состояния в xml - True, False и ... отсутствует.

3 голосов
/ 24 ноября 2011

Прагматичное (читай взломать) решение заключается в том, что я ссылался на System.Web.Mvc.dll в «Проекте B».Это определенно не правильное решение, поэтому, пожалуйста, принесите мне лучшее решение: -)

1 голос
/ 24 января 2012

Одно из предложений, которое я видел для этого, - изменить все ваши проекты, чтобы они имели одинаковый путь вывода.Это имеет ограниченную ценность, поскольку, если у вас есть цепочка зависимостей, такая как: Prj B> Prj A> Lib C, то это, вероятно, потому, что Prj A совместно используется несколькими приложениями, для которых вы захотите, чтобы у каждого был свой собственный выходной путь.

Я решил проблему, вместо этого используя MSBuild для компиляции, и установив свойство OutDir для каждой сборки.

например, MSBuild projectB.csproj /p:OutDir=C:\AppBOutput\

Это поместит выходные данные для проекта B,его зависимые проекты (prj A) и prj As копируют все локальные зависимости в каталог C: \ AppBOutput \.

Почему это работает

При сборке проекта в Visual Studio оба prj Aи prj B имеют свой собственный выходной каталог, например prjA\bin\debug и prjB\bin\debug.Сохраненная в GAC сборка, установленная на copylocal, будет включена в выходной каталог проекта, который непосредственно ссылается на него (prjA).Но он будет не скопирован в выходной каталог проекта, ссылающегося на этот проект (prjB).Так работает копирование ссылок на проект.Окунитесь в цели MSBuild, и я уверен, что основная причина может быть найдена (извините, не делаю это сам).

Что делает параметр /p:OutDir=C:\AppBOutput\ MSBuild, так это установление выходного каталога all проектов будут одинаковыми.Делая это, вы обходите MSBuild так, как он копирует эталонные выходные данные проекта.Вместо того чтобы полагаться на MSBuild для копирования некоторых содержимого в prjA\bin\debug в prjB\bin\debug, вы просто принудительно выводите все проекты в один и тот же каталог.

...