15

我有一个使用 CopyLocal=TRue 引用 System.Web.Mvc 的“项目 A”。System.Web.Mvc 在我的本地机器和构建服务器上都在 GAC 中。

我还有一个“Project B”,它在“Project B”的输出中引用“Project A”,System.Web.Mvc 在构建期间不会复制到。

我怀疑这是因为它在 GAC 中。这是真的?我可以做些什么让 MSBuild 将其复制到输出文件夹吗?

我在这个线程中阅读了 Muse VsExtensions 的答案,它只讨论了对 GAC 的直接引用,但是我们通过“项目 A”进行了间接引用: .NET 参考“复制本地”真/假基于内容设置广汽

这篇博文也相关: http ://deeperdesign.wordpress.com/2010/02/08/msbuild-assembly-dependencies-and-the-gac/

4

3 回答 3

8

您是否检查了 .csproj 文件以验证该引用确实包含该<Private>True</Private>标记?不幸的是,复制本地在 xml 中有 3 种状态 - True、False 和...缺失。

于 2011-11-24T11:55:47.007 回答
3

一个务实的(阅读黑客)解决方案是我在“项目 B”中引用了 System.Web.Mvc.dll。这绝对不是正确的解决方案,所以请给我一个更好的解决方案:-)

于 2011-11-24T12:47:53.383 回答
1

我看到的一个建议是更改所有项目以具有相同的输出路径。但是,这价值有限,因为如果您有一个依赖链,例如: 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\debugprjB\bin\debug. GAC 存储的程序集设置为 copylocal 将包含在直接引用它的项目的输出目录中 (prjA)。但它不会被复制到引用该项目 (prjB) 的项目的输出目录中。这就是项目引用复制的工作方式。深入研究 MSBuild 目标,我确信可以找到根本原因(抱歉,不是我自己做的)。

MSBuild 参数的作用是将所有/p:OutDir=C:\AppBOutput\项目的输出目录设置为相同。通过这样做,您可以避开 MSBuild 如何复制项目到项目的参考输出的行为。无需依赖 MSBuild 将某些内容复制到 中,您只需强制所有项目输出到同一目录即可。prjA\bin\debugprjB\bin\debug

于 2012-01-23T21:03:44.290 回答