.net 何时应将copy local设置为true,何时不应设置为true?

.net 何时应将copy local设置为true,何时不应设置为true?,.net,msbuild,reference,copy-local,.net,Msbuild,Reference,Copy Local,我想知道,对于何时设置copy local=true以供参考,是否有任何启发式方法 如果引用的类型仅在内部使用,我可以将copy local设置为true,但如果引用的类型作为参数公开或返回值,我可以将copy local设置为false,并指示在使用我的库时应引用依赖项的特定版本 有人能帮我澄清一下吗?此选项只影响构建阶段。它只是将引用复制到生成程序集的本地目录 如果另一个程序集(T)希望使用您正在生成的程序集(a)中的方法,该方法具有来自另一个引用程序集(R)的返回类型或参数,则它(T)应该

我想知道,对于何时设置
copy local=true
以供参考,是否有任何启发式方法

如果引用的类型仅在内部使用,我可以将
copy local
设置为
true
,但如果引用的类型作为参数公开或返回值,我可以将
copy local
设置为
false
,并指示在使用我的库时应引用依赖项的特定版本


有人能帮我澄清一下吗?

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


如果另一个程序集(T)希望使用您正在生成的程序集(a)中的方法,该方法具有来自另一个引用程序集(R)的返回类型或参数,则它(T)应该能够访问该程序集(R)。如果引用的程序集(R)安装在GAC中,那么它可能不需要做任何特殊的操作就可以完成此操作。否则,它需要一个本地副本。

本地副本对于部署场景和工具非常重要。作为一般规则,如果引用不包含在GAC中,则应使用CopyLocal=True


Copy Local本质上意味着我必须手动部署此DLL才能使我的应用程序正常工作。当它为false时,它实际上意味着“我依赖于另一个必须单独安装或链接的组件,DLL将已经存在。”

这实际上是关于目标环境的。如果copy local为false,则表示程序集将已经存在于目标环境中(通常在GAC中)。将其设置为true可确保它将出现在生成的输出中,从而更容易部署到目标环境。

查看以下MSDN参考资料,其中详细解释了CopyLocal行为

不幸的是,在如下所示的二级程序集中,对于程序集引用,存在一些怪癖,CopyLocal将不需要进行预期的工作

  • MainApp.exe
    • MyLibrary.dll
      • ThirdPartyLibrary.dll(如果在GAC CopyLocal中,则不会复制到MainApp bin文件夹)

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

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

CopyLocal在构建大型源代码树时尤其令人痛苦。有一个相关的问题,关于如何在此处禁用CopyLocal,以便您可以在上看到它。以及

我在这篇文章中写过如何处理构建大型源代码树的问题


因此,简言之,当文件复制导致构建花费的时间超过您愿意为每个构建花费的时间时,我会说禁用CopyLocal。

Set CopyLocal=false将缩短构建时间,但在部署期间可能会导致不同的问题


我设置CopyLocal=false的经验没有成功。请参阅我的博客文章中的赞成和反对意见摘要“

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


在我创建的进程中,可以为文件夹运行该进程。我尝试了一个大的构建,但是结果并没有那么令人印象深刻。我想这可以归结为项目的文件夹结构。

它做的不止这些。它严重影响部署场景。我相信它不会影响构建,除了一个简单的文件复制过程。如果这不是真的,请纠正我。@Mehrad,这会影响构建场景,但至少在部署方面也是一样的。@JaredPar:哦,当然。我对此没有异议。我想这可能是在大会上做的一些我不知道的特殊事情。无论如何,谢谢。如果我有一个在内部使用LibX(不在gac中)并且不公开任何LibX特定类型的实用程序库MyUtils,那该怎么办呢。在那里,我会将copy local设置为true。然而,如果我从MyUtils中公开LibX类型,我将不得不从使用MyUtils no的ProjectA中引用LibX?在这种情况下,我是否应该像引用来自ProjectA的LibX和MyUtils一样将copy local设置为false?这样说是否更好“仅当您将输出更改为将项目生成到同一输出文件夹并确保在该文件夹中具有所需的所有引用时,才禁用CopyLocal。”?@MichaelFredgeim:您找到问题的答案了吗?更新了链接,我希望Microsoft在移动内容后能够重定向。