引用DLL文件不会复制到与部署项目导致错误的bin

我们在Web应用程序项目中引用了几个外部DLL文件。 我们有一个部署项目在主机服务器上进行安装。 当我们使用.NET 3.5和Visual Studio 2008时,DLL文件被复制到bin文件夹。 由于我们升级到.NET 4和Visual Studio 2010,这不再发生,我们正在得到服务器错误,因为找不到引用。

CopyLocal被设置为true,并且我无法findweb.config中的任何内容,这表明这是在其他地方设置的。

Visual Studio 2010中存在一个错误。默认情况下,解决scheme文件中的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> 

鉴于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> 

诀窍是将Copy Local设置为False保存项目 ,然后将其重置为True再次保存 。 这包括MSBuild尊重的正确的私人节点。

看起来Visual Studio 2010中不包含专用节点( Copy Local )的默认值为True ,而MSBuild将缺less的节点读取为False

我遇到了同样的问题,而不是添加“BeforeBuild”步骤,我创build了一个简单的testing

  [TestMethod] public void ReferenceAssemblyThatDoesNotCopyToBuildFolder() { Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler referenceThisButDoNotUseIt = null; } 

并修复了错误types“Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler …”无法parsing

我的部署项目发生了一些奇怪的事情。 当我看到它没有检测到依赖项时,我删除了主输出并重新添加它。

依赖关系现在显示并在安装时被放置在bin文件夹中。

我得到完全相同的问题。 我们有一个引用EnterpriseLibrary的Visual Studio 2008项目。 当我们使用TFS和Web部署项目运行我们的集成版本时,所有的DLL文件都被复制过来了。 当我们升级到Visual Studio 2010,TFS 2010和WDP 2010时,一些DLL文件丢失了。 奇怪的是,这只发生在一些DLL文件,而不是其他的。

例如,我们得到Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.dll在这两种情况下复制,但不是Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.dll。

作为解决方法,我使用“BeforeBuild”步骤复制文件。

现在看起来好了。

我只是有同样的问题,想分享我发现,因为它可能有助于某人:

我的理由是,在安装某个第三方应用程序的过程中,程序集安装在GAC中。

如果DLL文件位于GAC中,编译器将不费心将其复制到目标文件夹,除非您使用Junto提到的项目文件中的“Private”节点专门将其标记为“copy local”。

问题是,如果不添加该节点,并且在一台机器上开发并构build在另一台机器上,并且该DLL文件只在构build机器的GAC中,那么没有私有节点的缺省行为将导致文件要在开发机器上正确复制,而不是在构build机器上复制。

更大的问题是,如果DLL文件没有直接引用,但是项目引用了第二个项目,该项目又引用该DLL文件。 在这种情况下,您不能将该DLL文件标记为在项目中“复制本地”,因为它没有被引用。 因此,如果DLL文件存在于GAC中,它将不会被复制到您的输出文件夹中。

这种情况可能的解决scheme是:

  • 从GAC中卸载DLL文件
  • 在最终项目中添加对DLL文件的直接引用
  • 使用新的强名称重新签名DLL文件,这将与GAC中的DLL文件区分开来。

我没有遇到同样的问题,但类似。 我有WPF主项目和引用的项目,其中引用没有复制。 我发现,在我的情况下,主要项目是NET 4.0客户端configuration文件和NET 3.5引用。 当我将主项目设置为3.5时,被引用的项目的已编译的dll开始复制。 (我不知道为什么,因为我通过实践来解决这个问题)

我也遇到了一个类似的问题,其中引用的dll没有被复制到发布文件夹中的bin中。 我正在使用TFS签出的副本,不包括bin文件夹到应用程序中。 – >所以刚刚包括bin文件夹。 – >build立引用的应用程序 – >发布的网站项目现在我看到在发布的文件夹中的bin中的所有引用的DLL

我和VS 2012 Express有类似的问题。 我在我的项目中使用了Tesseract库。 一切都运行良好,直到我在一个解决scheme中使用这个项目的地方不止一个项目。 问题是,一些通常放在文件夹bin / debug / x86或bin / debug / x64中的DLL(liblept168.dll,libtesseract302.dll)仅在我重新构build整个解决scheme时被复制。 更改一行并再次构build它会导致DLL被删除,而不是被复制回来。

我通过向启动项目添加创build缺lessDLL的项目的引用来解决此问题。

rzen和其他人,谢谢 – 您的意见为我们提供了一个解决scheme。

我们有一个针对Microsoft.ReportViewer.Common.dll和Microsoft.ReportViewer.WebForms.dll程序集(我们在'src'级创build的单独“libs”文件夹)版本10的项目。 但是当我们构build时,输出包括最近安装在构build服务器上的版本12。

在这里使用注释,我们确保“Copy Local”被设置为True,并且该标志被设置在项目文件中。 然而,它仍然在部署版本12.所以我们发现这样做的诀窍是确保“特定版本”属性也设置在两个引用。 瞧,每个文件的版本10现在正在部署!

有很多欢乐。

JH

如果您的项目不直接加载库,即使明确引用它也不会总是被部署。 我感到困惑,因为我可以在本地Bin目录中看到它,但在部署时看不到。 在Bin目录中的DLL是一个旧的文件,在清理过程中没有被删除,这就是为什么我感到困惑。

一个完整的清理和重build,它不是在我的本地Bin文件夹中显示我的问题(我只在web.config中使用它)。 然后,我在项目中引用了dll文件本身,并将其设置为复制以输出,以确保它被部署。

我不确定它是如何在Visual Studio 2008中设置的,但我几乎肯定您可能已经使用Post-Build事件命令行。 在那里你可以告诉复制你需要部署的DLL文件。 下面给出一个例子:

 mkdir $(SolutionDir)\Deployment copy "$(SolutionDir)Your_Library_Name\Your_Dll_ForDeployement.dll" $(SolutionDir)\Deployment\ 

我们可以使用<Private>False</Private>来不将引用的DLL文件复制到bin目录。 当我们在单独的TFS构build服务器中构build应用程序时,这非常有用,我们需要构build应用程序,而不是将DLL文件复制到bin目录。

检查DLL文件已被引用的项目的框架。 框架应该是.NET 4.0。 如果框架是客户端configuration文件,请更正它。