复制本地如何工作? log4net.dll不被复制到MyProject输出目录

我想知道什么copy-local = true的参考确切地做。 它是否将引用程序集及其所有依赖项复制到输出目录?

我的情况如下:我有一个自定义的日志包装,利用log4net。 我构build了一个发行版本,将log4net.dll引用设置为copy-local true。 引用MyProject中MyLogWrapper.dll与本地复制设置为true应导致log4net.dll被复制以及? 我只在MyProject中引用MyLogWrapper.dll和它的所有依赖项。 log4net.dll不被复制到MyProject输出目录,但MyLogWrapper的所有其他依赖项都是。 可能是什么问题呢?

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

不幸的是,根据以下MSDN文档中的说明 ,似乎CopyLocalfunction不能像GAC中已有的程序集那样工作。

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

更多的信息可以在下面的页面find,详细介绍了项目引用的工作原理。

MSDN:项目参考

在MSDN上问这个问题之后 – 这似乎是这个行为是devise的。 “如果您部署/复制包含在GAC中注册的自定义组件的引用的应用程序,则无论”本地复制“设置如何,都不会将该组件部署/复制到应用程序中。

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

你需要对本地复制保持警惕,因为它已经把我赶出去了!

只是偶尔,对于一个特定的.dll它会静静地将其复制到生成文件夹。 通常这不会显示在开发机器上,因为dll通常也在GAC中(如果您已经安装了用于开发的开发工具/库),所以您不会注意到,直到它被distrobuted /捆绑到一个安装程序和所需的文件在客户机上丢失。

这个bug没有太多的信息,但这个线程演示了一个特定的库: 这里 。

被抓住了,我认为这是一个好主意(通常在任何情况下)准确地知道你的项目需要哪些程序集,并有一个脚本或类似的自动操作,以确保所有必要的组件都存在,或者更有可能当你做一个安装程序,或收集文件分发,

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

在你的情况下,DLL可能会使用其他的DLL,所以它也需要。

我发现,如果引用的项目具有对GAC程序集的依赖关系,那么在Visual Studio 2015中就不会再使用项目引用。 GAC程序集总是被复制到根项目的输出中,并且仅在涉及GAC dll的引用的项目的输出中复制local = false。

连接反馈