我想知道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),它就会开始在本地复制.任何人都可以确认这是问题吗?
不幸的是,根据MSDN文档中的以下声明,似乎CopyLocal功能对于GAC中已有的程序集不起作用.
如果部署的应用程序包含对GAC中注册的自定义组件的引用,则无论CopyLocal设置如何,该组件都不会随应用程序一起部署.在以前版本的Visual Studio中,您可以在引用上设置CopyLocal属性以确保部署了程序集.现在,您必须手动将程序集添加到\ Bin文件夹.这使得所有自定义代码都受到严格审查,从而降低了发布您不熟悉的自定义代码的风险.
可在以下页面找到更多信息,该页面解释了有关项目引用如何工作的详细信息.
MSDN:项目参考
问MSDN上的这个问题后在这里 -看来,这种行为是由设计."如果部署/复制包含对GAC中注册的自定义组件的引用的应用程序,则无论"复制本地"设置如何,都不会使用该应用程序部署/复制该组件.
有一个技巧:将引用Copy Local设置为false,然后再设置为true,Visual Studio会自动为该引用添加Private元数据.至少VS 2010确实如此.我最近这样做是为了解决我们的TFS Build服务器的一个问题,由于一些奇怪的原因,在GAC中安装了许多Enterprise Library组件,因此在从TFS Drop文件夹部署项目时遇到了重大问题.那个错误/真实的伎俩救了我们
你需要对本地复制有点警惕,因为它过去让我感到困惑!
偶尔,对于特定的.dll,它将无法将其复制到构建文件夹.通常这不会出现在开发机器上,因为dll通常也在GAC中(如果你已经安装了一个用于开发的开发工具/库),所以在它被分配/捆绑之前你不会注意到安装程序,客户端计算机上缺少所需的文件.
关于这个bug的信息不多,但这个帖子为特定的库演示了它:这里.
抓住这个问题后,我认为(通常在任何情况下)确切地知道项目需要哪些程序集并且有一个脚本或类似的自动操作来确保所有必需的组件都存在,无论是在构建时,或更有可能在您制作安装程序或收集文件以进行分发时,