我们的Web应用程序项目中引用了几个外部DLL文件。我们有一个用于在托管服务器上安装的部署项目。当我们使用.NET 3.5和Visual Studio 2008时,DLL文件被复制到bin文件夹。由于我们已经升级到.NET 4和Visual Studio 2010,因此无法再找到服务器错误,因为无法找到引用。
CopyLocal设置为true,我在web.config中找不到任何内容,表明这是在其他地方设置的。
答案 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文件 - 它将无法复制到您的输出文件夹。
这种情况的可能解决方案是:
答案 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)
我们有一个针对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命令行中解决了该问题。