什么时候应该将copy-local设置为true,何时不应该将其设置为true?


76

我想知道什么时候可以设置copy-local=true参考资料?

如果只能在内部使用引用的类型copy-localtrue但是如果引用的类型作为参数或返回值公开copy-localfalse并且指示使用我的库时应该引用特定版本的依赖项,则可以设置为?

谁能为我澄清一下?

Answers:


70

本地复制对于部署方案和工具很重要。通常,如果引用未包含在GAC中,则应使用CopyLocal = True。

从本地复制实际上意味着我必须手动部署此DLL才能使我的应用程序正常工作。如果为假,则本质上意味着“我依赖于必须单独安装或链接的另一个组件,DLL将会已经存在”。


1
如果我有一个实用程序库MyUtils,该实用程序库在内部使用LibX(不在gac中)并且不公开任何LibX特定类型,该怎么办。在那里,我将copy-local设置为true。但是,如果我从MyUtils公开LibX类型,则必须参考。以及使用MyUtils的ProjectA的LibX否?
渐弱证明

在那种情况下,我是否应该将copy-local设置为false,因为我必须从ProjectA引用LibX以及MyUtils?
Fadeproof

21

复制本地实际上是为了支持本地调试而实现的。在为打包和部署准备应用程序时,应将项目构建到相同的输出文件夹,并确保在那里拥有所需的所有引用。

当构建大型源代码树时,CopyLocal特别麻烦。有一个有关如何在此处禁用CopyLocal的相关问题,因此您可以在如何覆盖MSBUILD的.NET中引用的CopyLocal(私有)设置中看到它。以及Visual Studio(2008)中大型解决方案的最佳做法。

我已经在文章MSBuild:创建可靠构建的最佳实践,第2部分中写了关于如何处理大型源代码树的文章。

简而言之,当文件复制使您的构建花费更多的时间时,我会说禁用CopyLocal,然后您愿意为每个构建花费。


3
最好说“仅当更改输出以将项目构建到相同的输出文件夹并确保在那里拥有所需的所有引用时,才禁用CopyLocal”吗?
Michael Freidgeim

@MichaelFreidgeim:您找到问题的答案了吗?
Dave New

15

这实际上与目标环境有关。如果本地副本错误,则表示该程序集将已存在于目标环境中(通常在GAC中)。将其设置为true可以确保它会出现在您的构建输出中,从而使部署到目标环境更加容易。


8

请查看以下MSDN参考,该参考详细解释了CopyLocal行为。

项目参考

不幸的是,有一些怪癖,而CopyLocal并不需要按如下所示构造辅助装配中的装配引用所需的工作。

  • 主程序
    • MyLibrary.dll
      • ThirdPartyLibrary.dll(如果在GAC CopyLocal中不会复制到MainApp bin文件夹中)

如果您不打算将第三方程序集安装到目标计算机上的GAC中,这将使xcopy部署变得困难。


1
更新了链接,希望微软在移动内容后会重定向。
jpierson

2

此选项仅影响构建阶段。它只是将引用复制到已生成程序集的本地目录。

如果另一个程序集(T)要使用您正在构建的程序集(A)中的方法,该方法具有另一个引用的程序集(R)的返回类型或参数,则该程序集(T)应该能够访问该程序集(R)。如果在GAC中安装了引用的程序集(R),则可能无需做任何特殊的操作即可。否则,它需要该文件的本地副本。


3
它的作用远不止于此。它严重影响部署方案。
JaredPar

我相信它只影响简单的文件复制过程,不会影响构建。如果不正确,请纠正我。
mmx

@Mehrad,它将影响构建方案,但至少也同样针对部署。
JaredPar

@JaredPar:当然可以。我对此没有异议。我认为这可能是我不知道的在装配过程中做的特别的事情。不管怎么说,还是要谢谢你。
mmx

1

将CopyLocal设置为false的保守方法是检查是否在项目的输出路径中找到了引用。这应该使您能够避开一些令人讨厌的运行时问题,同时仍然减少IO的数量。

在此过程中,我创建了CopyLocalFixer,可以为一个文件夹运行它。我尝试了一个大型构建,但是说实话结果并不令人印象深刻。我想这取决于项目的文件夹结构。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.