GAC中的程序集不会复制到项目中的输出,该项目引用引用具有CopyLocal = true的GAC程序集的项目

时间:2011-11-24 11:48:50

标签: msbuild gac msbuild-projectreference

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

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

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

我在这个帖子中读到了Muse VsExtensions的答案,该答案仅讨论了对GAC的直接引用,但我们通过“项目A”间接引用: .NET Reference "Copy Local" True / False Being Set Based on Contents of GAC

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

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

我见过的一个建议就是将所有项目更改为具有相同的输出路径。这是有限的价值,因为如果你有一个依赖链如下: Prj B> Prj A> Lib C 然后可能是因为Prj A在多个应用程序之间共享,您希望每个应用程序都有自己的输出路径。

我解决了这个问题,而是使用MSBuild进行编译,并在每次构建时设置OutDir属性。

e.g。 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。设置为copylocal的GAC存储的程序集将包含在直接引用它的项目的输出目录中(prjA)。但它将复制到引用该项目(prjB)的项目的输出目录中。这就是项目引用复制的工作原理。深入了解MSBuild目标,我确定可以找到潜在的原因(抱歉,不是自己动手)。

/p:OutDir=C:\AppBOutput\ MSBuild参数的作用是将所有项目的输出目录设置为相同。通过这样做,您可以逐步执行MSBuild如何复制项目到项目引用输出的行为。您只需强制所有项目输出到同一目录,而不是依赖MSBuild将prjA\bin\debug中的部分复制到prjB\bin\debug,而只是强制所有项目输出到同一目录。