我有一个“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/
答案 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\debug
和prjB\bin\debug
。设置为copylocal的GAC存储的程序集将包含在直接引用它的项目的输出目录中(prjA)。但它将不复制到引用该项目(prjB)的项目的输出目录中。这就是项目引用复制的工作原理。深入了解MSBuild目标,我确定可以找到潜在的原因(抱歉,不是自己动手)。
/p:OutDir=C:\AppBOutput\
MSBuild参数的作用是将所有项目的输出目录设置为相同。通过这样做,您可以逐步执行MSBuild如何复制项目到项目引用输出的行为。您只需强制所有项目输出到同一目录,而不是依赖MSBuild将prjA\bin\debug
中的部分复制到prjB\bin\debug
,而只是强制所有项目输出到同一目录。