79

我想知道何时设置copy-local=true参考是否有任何启发式方法?

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

任何人都可以为我澄清这一点吗?

4

7 回答 7

73

本地复制对于部署方案和工具很重要。作为一般规则,如果引用不包含在 GAC 中,则应使用 CopyLocal=True。

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

于 2009-03-02T15:35:01.740 回答
22

真正实现了复制本地以支持本地调试。当你为你的应用程序打包和部署时,你应该将你的项目构建到相同的输出文件夹中,并确保你在那里有你需要的所有引用。

在构建大型源代码树时,CopyLocal 尤其令人头疼。有一个关于如何在此处禁用 CopyLocal 的相关问题,您可以在How do I override CopyLocal (Private) setting for references in .NET from MSBUILD中看到它。以及Visual Studio (2008) 中大型解决方案的最佳实践。

我在文章MSBuild: Best Practices For Creating Reliable Builds, Part 2中写过如何处理构建大型源代码树。

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

于 2010-01-07T21:57:37.683 回答
15

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

于 2009-03-02T15:35:38.507 回答
8

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

项目参考

不幸的是,对于二级程序集中的程序集引用,存在一些怪癖,CopyLocal 不会像预期的那样工作,如下所示。

  • 主应用程序
    • 我的图书馆.dll
      • ThirdPartyLibrary.dll(如果在 GAC CopyLocal 中不会复制到 MainApp bin 文件夹)

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

于 2009-06-10T05:40:32.550 回答
2

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

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

于 2009-03-02T15:34:30.023 回答
1

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

我设置 CopyLocal=false 的经验并不成功。请参阅我的博客文章“不要将“复制本地”项目引用更改为 false中的优缺点摘要,除非了解子序列。

于 2012-12-09T02:26:01.417 回答
1

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

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

于 2018-02-21T18:23:28.907 回答