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

Msbuild GAC中的程序集不会复制到引用CopyLocal=true的GAC程序集的项目中的输出,msbuild,gac,msbuild-projectreference,Msbuild,Gac,Msbuild Projectreference,我有一个引用System.Web.Mvc的“项目a”,CopyLocal=TRue。 System.Web.Mvc在本地计算机和buildserver上都位于GAC中 我还有一个“Project B”,它在“Project B”System的输出中引用了“Project a”。在构建过程中,不会复制到Web.Mvc 我怀疑这是因为它在GAC中。 这是真的吗? 我可以做些什么使MSBuild将其复制到输出文件夹吗 我在这篇文章中读到了Muse VsExtensions的答案,其中只提到了对GAC的

我有一个引用System.Web.Mvc的“项目a”,CopyLocal=TRue。 System.Web.Mvc在本地计算机和buildserver上都位于GAC中

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

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

我在这篇文章中读到了Muse VsExtensions的答案,其中只提到了对GAC的直接引用,但是我们通过“项目A”间接引用了它:

这篇博文也与以下内容相关:

您是否检查了.csproj文件以验证引用确实包含
True
标记?不幸的是,Copy local在xml中有3种状态-True、False和。。。缺少。

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

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

我通过使用MSBuild进行编译,并在每个生成上设置OutDir属性,解决了这个问题

e、 g.
MSBuild项目b.csproj/p:OutDir=C:\AppBOutput\

这将把项目B、其依赖项目(prj A)和prj的输出作为复制本地依赖项全部放入C:\AppBOutput\目录

为什么有效 在Visual Studio中构建项目时,prj A和prj B都有自己的输出目录,例如
prjA\bin\debug
prjB\bin\debug
。设置为copylocal的GAC存储程序集将包含在直接引用它的项目(prjA)的输出目录中。但它不会被复制到引用该项目(prjB)的项目的输出目录中。这就是项目引用复制的工作方式。深入研究MSBuild目标,我确信可以找到根本原因(对不起,我自己没有这么做)


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

I实际上将True添加到了“Project B”的csproj文件中,其中引用了“Project A”。但是我仍然没有在输出文件夹中获取System.Web.Mvc。在“项目A”中,我已经在csproj文件中找到了True。True对解决该问题没有帮助。谢谢。这确实解决了我的问题。我有一个Azure Worker角色项目,其打包的部署文件缺少一些引用的DLL。由于其他原因,这些DLL位于我本地计算机上的GAC中(但不会位于Azure上的GAC中)。即使项目引用有Copy Local,在记事本中打开项目文件也会显示每个DLL都缺少私有标记。我将“复制本地”属性更改为false,保存了项目,然后返回true并再次保存。这足以将丢失的私有标记正确插入到.csproj项目文件xml和Azure中。有趣的是,即使您的项目引用的程序集副本不在GAC中,也会发生这种情况。VS看到一个副本存在于GAC中,不会复制它。这个假设是正确的。将MSBuild verbosity设置为diagnostic会使此引用不是“CopyLocal”,因为它在解析依赖项时已在GAC中注册。。请接受我的投票。这就是我从古到今处理这些废话的方式。嗨,凯比,你找到解决这个问题的办法了吗?这是一个比标记为答案的更好的办法。不清楚这将如何解决这个问题。在这种情况下,将所有项目设置为输出到同一目录完全没有任何作用自从@Al-Muhandis发表评论以来,我收到了一些对这个答案的反对票,所以我编辑了我的答案来解释为什么这样做。4年半后,我现在也重新测试了解决方案!使用VS2015和MSBuild 14.0,可以验证其行为是否仍然相同。鉴于MVC现在最好通过NuGet引用,这一点在那里是没有意义的,但对于其他GAC ed程序集(例如System.Xml.dll),情况仍然相同。