引用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文件,请更正它。
- 如何将UserControl放入Visual Studio工具箱
- 在Visual Studio中重命名解决scheme(和目录)的正确方法
- 上下文菜单添加控制器/查看丢失
- 在.NET中的Getter和Setter声明
- VS.NET 2010中的exception窗口缺less“User-unhandled”列
- 如何在Visual Studio 2010中来回走动
- 用于Windows的Visual Studio Express 2013和用于Windows Desktop的Visual Studio Express 2013有什么区别?
- 无法在IIS 7.5上运行ASP.NET MVC 2 Web应用程序
- 在Visual Studio 2010中传递命令行参数?