引用DLL文件没有复制到bin,部署项目导致错误

g.f*_*ley 60 web-deployment-project visual-studio-2010

我们的Web应用程序项目中引用了几个外部DLL文件.我们有一个用于在托管服务器上安装的部署项目.当我们使用.NET 3.5和Visual Studio 2008时,DLL文件被复制到bin文件夹.由于我们已经升级到.NET 4和Visual Studio 2010,因此不再发生这种情况,并且由于无法找到引用,因此我们收到服务器错误.

CopyLocal设置为true,我在web.config中找不到任何内容,表明这是在其他地方设置的.

Reb*_*cca 103

Visual Studio 2010中存在一个错误.默认情况下,解决方案文件中的XML如下所示:

<Reference Include="DevExpress.SpellChecker.v11.1.Core,
           Version=11.1.5.0,
           Culture=neutral,
           PublicKeyToken=b88d1754d700e49a,
           processorArchitecture=MSIL">
<HintPath>..\References\DevExpress.SpellChecker.v11.1.Core.dll</HintPath>
</Reference>
Run Code Online (Sandbox Code Playgroud)

而MSBuild期待以下这一点,以便DLL文件将包含在部署中:

<Reference Include="DevExpress.SpellChecker.v11.1.Core,
           Version=11.1.5.0,
           Culture=neutral,
           PublicKeyToken=b88d1754d700e49a,
           processorArchitecture=MSIL">
<HintPath>..\References\DevExpress.SpellChecker.v11.1.Core.dll</HintPath>
<Private>True</Private>
</Reference>
Run Code Online (Sandbox Code Playgroud)

关键是要设置Copy LocalFalse,保存项目,然后将其复位即可True- 再次保存.这包括正确的私有节点,MSBuild尊重.

似乎Copy LocalVisual Studio 2010中没有包含私有节点()的默认值是True,而MSBuild将缺少的节点读取为False.

  • VS2012中仍然存在Bug.它确实应该修复,花了我一段时间才找到这个解决方案. (22认同)
  • 我在VS2015中遇到了同样的问题.仅供参考,本答案中提到的XML参考文献存储在项目文件中,而不是解决方案文件中. (11认同)
  • 今天我发现这个CopyLocal技巧不会影响当前项目上面的引用.例如,我有一个项目实体,它引用了GAC中的some.dll.如果我如上所述强制someLocal = true为some.dll,一切似乎都很好 - some.dll被复制到实体的bin文件夹.但是,如果我在某些项目服务中引用Entities项目并希望将some.dll复制到Services\bin,则不会发生 - 服务项目忽略了Entities项目的CopyLocal = true并仍然从中获取some.dll GAC.使用VS2012. (5认同)
  • 当我配置nuGet以提供丢失的包时,我遇到的是VS2013.我发现成功解决这个问题的唯一方法是将缺少的程序集的引用添加到我的启动项目中.Yecch. (2认同)