Asp.net 为什么MSBuild在复制本地设置为false的情况下复制DLL?

Asp.net 为什么MSBuild在复制本地设置为false的情况下复制DLL?,asp.net,.net,visual-studio,msbuild,web-application-project,Asp.net,.net,Visual Studio,Msbuild,Web Application Project,这就是我们解决方案的结构: Solution.sln WebApp.csproj references ClassLibrary ClassLibrary.csproj references System.Net.Http.Formatting.dll with Copy local = false 当我使用WebApp和ClassLibrary的源代码构建解决方案时,会按预期复制本地作品,并且不会将System.Net.Http.Formatting.dll复制到We

这就是我们解决方案的结构:

Solution.sln
  WebApp.csproj
    references ClassLibrary
  ClassLibrary.csproj
    references System.Net.Http.Formatting.dll with Copy local = false
当我使用WebApp和ClassLibrary的源代码构建解决方案时,会按预期复制本地作品,并且不会将System.Net.Http.Formatting.dll复制到WebApp/bin目录

但是,当我们将项目分发给最终客户机时,我们只向他们提供引用编译类库(.dll)的WebApp源代码。在这种情况下,解决方案如下所示:

Solution.sln
  WebApp.csproj
    references ClassLibrary.dll which uses System.Net.Http.Formatting.dll
编译此部分编译的解决方案时,System.Net.Http.FORMATING.dll被复制到WebApp/bin文件夹,这给我们带来了一些麻烦

我已经检查了详细的构建输出,复制任务复制了dll,该dll的源位置为

C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\System.Net.Http.Formatting.dll
还有一些提到System.Net.Http.Formatting.dll程序集的内容,我不太理解

如何确保System.Net.Http.FORMATING.dll未复制到bin文件夹


谢谢

看起来copylocal符号位于客户未读取的项目文件中,那么它怎么知道呢?您可以直接将引用添加到它们所拥有的项目文件中,而不是通过可传递的依赖项来发现它们。然后您可以将它们标记为无本地副本。我认为将它们作为参考添加到WebApp.csproj应该完全在GUI中完成这项工作。从这个开始,如果XML不太好,就修改它。

可以做的一件事是在构建后事件中放入类似于
del$(TargetDir)的内容System.Net.Http.Formatting.dll/Q/F
您应该首先确定复制文件的步骤。@T.S.我们不希望bin/文件夹中的dll允许客户将自己的dll放在其中。假设我们在版本2中使用System.Net.Http.Formatting.dll,但我们的客户希望在版本4中使用System.Net.Http.Formatting.dll。这就是为什么我们保持bin/clean并从其他位置加载我们的DLL版本。从bin/文件夹中删除文件也会删除客户的版本。不过还是要谢谢你@jdlugosz从构建详细输出中,我想它是这样一个:文件“C:\Program Files(x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets”中的目标“\u CopyFileMarkedCopyLocal”。任务“复制”。这些信息有用吗?感谢你所说的,听起来你的构建和发布逻辑都很糟糕。。我有同样的感觉,“复制本地”不是通过传递性引用传递的。。我将尝试直接引用这些DLL的技巧,看看会发生什么。感谢没有转移,因为没有任何地方可以找到的迹象。它没有合并到dll中。接受答案如何;还是还有什么问题?是的。。明天,我将按照您的建议尝试直接向web应用程序项目添加引用,如果有帮助,我会将答案标记为正确。否则,我们将不得不考虑其他解决方案再一次:非常感谢你的帮助!