1

我有大约 50 个项目的解决方案。

我将大部分项目(非测试项目)设置为输出到单个文件夹。

我听说“复制本地”可以减慢构建时间(对于项目引用),因为它必须将文件复制到它被引用的任何地方。

但是,如果每个项目都复制到同一个位置,那么 Visual Studio 是否足够聪明,可以看到文件已经存在并且不再复制它?

所以,这里有一个例子:

SolutionA
   |
   +---ProjectA (Output set to C:\MyProj)
   |
   +---ProjectB (Output set to C:\MyProj)
   |        References ProjectA
   |
   +---ProjectC (Output set to C:\MyProj)
   |        References ProjectB
   |
   +---ProjectD (Output set to C:\MyProj)
            References ProjectA

在正常的解决方案中,本地复制将控制对每个项目的 bin\Debug 文件夹的引用的副本。

但是我已经更新了项目属性的“输出”部分,以便它们都放到 C:\MyProj 而不是 bin\Debug。

如果我没有将 Copy Local 设置为 false 进行引用,ProjectA.dll 会被复制到 C:\MyProj 四次吗?还是 Visual Studio 足够聪明,只做一次?

4

2 回答 2

2

我认为您要问的是“将文件复制到自身上是否需要任何时间?” 如您所料,事实并非如此。您可以通过在 Microsoft.Build.Tasks 程序集中使用 Reflector 或 ILSpy 看到这一点,Copy 类执行复制。它的 DoCopyIfNecessary() 方法包含这行代码:

    if (string.Compare(sourceFileState.Name, destinationFileState.Name, StringComparison.OrdinalIgnoreCase) != 0)
    {
        flag = this.DoCopyWithRetries(sourceFileState, destinationFileState, copyFile);
    }

或者换句话说,如果源文件和目标文件相同,它会跳过副本。必然如此, File.Copy() 不会高兴。

于 2012-08-20T21:16:31.477 回答
0

将本地副本复制到 bin 目录。通常 Visual Studio 会在 Clean 命令上清空该目录。如果您不设置“复制本地”,则可能会冒着将所有引用都放在 bin 文件夹中的风险。

我想你可以用另一种方式将它们复制到 bin 文件夹中;但是如果您曾经运行过 Clean...

据我所知,VS 不够聪明,无法看到每个项目都有相同的 bin 目录,所以它会复制四次(尽管测试和验证)。在上述情况下,您可能只有一个带有 Copy Local 的项目并避免这种情况。但是,您至少需要一个 Copy Local ,否则您将遇到 bin 目录没有该文件的情况。

于 2012-08-20T18:56:31.423 回答