Copy-local如何工作? log4net.dll未被复制到MyProject输出目录

时间:2008-11-26 10:57:17

标签: .net build dependencies

我想知道copy-local = true对于引用究竟是什么。它是否将引用的程序集及其所有依赖项复制到输出目录?

我的方案如下: 我有一个使用log4net的自定义日志包装器。我构建了MyLogWrapper.dll的发布程序集,其中log4net.dll引用设置为copy-local true。从复制本地设置为true的MyProject引用MyLogWrapper.dll会导致log4net.dll被复制吗?我只引用MyLogWrapper.dll,而不是MyProject中的任何依赖项。 log4net.dll没有被复制到MyProject输出目录,但MyLogWrapper的所有其他依赖项都是。可能是什么问题?

我已经做了一些实验,似乎如果我从GAC中删除程序集(log4net.dll),它就会开始在本地复制。任何人都可以确认这是问题吗?

6 个答案:

答案 0 :(得分:31)

不幸的是,似乎根据MSDN documentation中的以下声明,CopyLocal功能对于GAC中已有的程序集不起作用。

  

如果部署的应用程序包含对GAC中注册的自定义组件的引用,则无论CopyLocal设置如何,该组件都不会随应用程序一起部署。在以前版本的Visual Studio中,您可以在引用上设置CopyLocal属性以确保部署了程序集。现在,您必须手动将程序集添加到\ Bin文件夹。这使得所有自定义代码都受到严格审查,从而降低了发布您不熟悉的自定义代码的风险。

更多信息可在以下页面找到,该页面解释了有关项目参考如何工作的详细信息。

MSDN: Project References

答案 1 :(得分:10)

在MSDN here上询问此问题后 - 似乎这种行为是设计的。 “如果部署/复制包含对GAC中注册的自定义组件的引用的应用程序,则无论”复制本地“设置如何,都不会随应用程序部署/复制该组件。”

答案 2 :(得分:7)

有一个技巧:将引用Copy Local设置为false,然后再设置为true,Visual Studio会自动为该引用添加Private元数据。至少VS 2010确实如此。我最近这样做是为了解决我们的TFS Build服务器的一个问题,由于一些奇怪的原因,在GAC中安装了许多Enterprise Library组件,因此在从TFS Drop文件夹部署项目时遇到了重大问题。那个错误/真实的伎俩救了我们。

答案 3 :(得分:5)

你需要对本地副本保持警惕,因为它过去曾让我感到震惊!

偶尔,对于特定的.dll,它会无声地将其复制到build文件夹中。通常这不会出现在开发机器上,因为dll通常也在GAC中(如果你已经安装了一个用于开发的开发工具/库),所以在它被分配/捆绑之前你不会注意到安装程序,客户端计算机上缺少所需的文件。

关于此错误的信息不多,但此主题针对特定库展示了它:here

被这个抓住了,我认为(通常在任何情况下)确切地知道项目需要哪些程序集并且有一个脚本或类似的自动操作来确保所有必需的组件都存在,这是一个好主意(无论如何)您构建,或更有可能在制作安装程序或收集文件以进行分发时,

答案 4 :(得分:4)

当本地副本设置为true时,它会将属性local copy = tue的所有程序集复制到应用程序的bin目录中。

在你的情况下,dll可能正在使用另一个dll,所以它也需要它。

答案 5 :(得分:0)

我发现,如果引用的项目依赖于GAC程序集,则在Visual Studio 2015中不再使用项目引用。 GAC程序集始终复制到根项目输出,并仅复制local = false,仅关注持有GAC dll引用的项目的输出。

Connect feedback