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

时间:2010-06-01 02:39:27

标签: visual-studio-2010 web-deployment-project

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

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

14 个答案:

答案 0 :(得分:102)

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>

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将缺少的节点读取为False

答案 1 :(得分:3)

我遇到了同样的问题,而不是添加“BeforeBuild”步骤,我创建了一个简单地执行此操作的测试

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

修复了错误类型'Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler ...'无法解析

答案 2 :(得分:2)

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

现在,依赖项显示在安装后放在bin文件夹中。

答案 3 :(得分:1)

我得到了完全相同的问题。我们有一个引用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”步骤复制了文件。

现在似乎建立好了。

答案 4 :(得分:1)

我刚遇到同样的问题,想分享我发现的内容,因为它可能对某人有所帮助:

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

如果DLL文件在GAC中,编译器就不必费心将其复制到目标文件夹,除非您专门将其标记为&#34; copy local&#34;使用&#34;私人&#34; Junto提到的项目文件中的节点。

问题在于,如果您不添加该节点,并且您在一台计算机上开发并在另一台计算机上构建,并且DLL文件仅在构建计算机的GAC中,则默认行为不在私有节点将导致文件在开发计算机上正确复制,但不会在构建计算机上复制。

更大的问题是如果DLL文件没有直接引用,但项目引用了第二个项目,而该项目又引用了DLL文件。在这种情况下,您无法将DLL文件标记为&#34;复制本地&#34;在项目中,因为它没有引用它。因此,如果GAC中存在DLL文件 - 它将无法复制到您的输出文件夹。

这种情况的可能解决方案是:

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

我没有遇到同样的问题,但相似。我有WPF主项目和引用的项目,其中引用没有复制。我发现在我的情况下,主项目设置为NET 4.0 Client Profile和.NET 3.5的引用。当我将主项目设置为3.5时,引用项目的已编译dll开始复制。 (我不知道为什么,因为我通过练习解决了它)

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

我也遇到了类似的问题,其中引用的dll没有被复制到已发布文件夹中的bin中。我使用的TFS签出副本没有将bin文件夹包含到应用程序中。      - &GT;所以只包括bin文件夹。      - &GT;构建引用的应用程序      - &GT;发布了网站项目     现在,我在已发布文件夹

中的bin中看到所有引用的dll

答案 10 :(得分:0)

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

我通过添加对启动项目创建缺少的DLL的项目的引用来解决此问题。

答案 11 :(得分:0)

rzen和其他人,谢谢 - 您的意见为我们找到了解决方案。

我们有一个针对Microsoft.ReportViewer.Common.dll和Microsoft.ReportViewer.WebForms.dll程序集的版本10的项目(我们在&#39; src&#创建了单独的&#34; libs&#34;文件夹39;等级)。但是当我们进行构建时,输出包括最近安装在构建服务器上的版本12。

在此处使用评论,我们确保&#39;复制本地&#39;设置为True并且标志已在项目文件中设置。但是,它仍然在部署版本12.所以我们发现这样做的诀窍是确保特定版本&#39;属性也设置在两个参考。 Voila,现在正在部署每个文件的第10版!

非常高兴。

JH

答案 12 :(得分:0)

如果您的项目没有直接加载库,则不会始终部署它,即使它已被明确引用!我感到困惑,因为我可以在本地Bin目录中看到它,但在部署时却看不到。 Bin目录中的dll是一个旧的文件,在Clean期间没有删除,这就是为什么我感到困惑。

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

答案 13 :(得分:0)

添加参数

  

/ deployonbuild = false

在msbuild命令行中解决了该问题。