【发布时间】:2014-11-27 14:13:05
【问题描述】:
写。提议的骗子:由于这里的问题与linked question相反,我宁愿认为它不是骗子。
首先,我确实阅读了What is the best practice for “Copy Local” and with project references?(也有this),无论如何我都必须尝试一下,但是获得对此的一般反馈似乎是必要的,因为docs 对此东西太可怕了,我只在 VS2010 上,也许他们在新版本中改变了一些东西,很高兴知道。
第二,我只对这个问题的 project 参考感兴趣,因为我已经 read that assemblies from the GAC are handled differently 和 GAC 无关我的问题。
第三,在阅读了建议的欺骗之后,但更重要的是 @Albireo 在这里的 answer,区分 file 依赖项似乎也很重要,其中依赖项引用了一个 dll 程序集文件和 project 依赖项(即我要问的),其中依赖项引用了一个 project 并隐式地引用了该项目的输出文件.
无论如何,情况就是这样,我觉得有点奇怪,但仍然:
- 2 个 C# 可执行项目
- n C# dll 程序集项目
- 这 2 个可执行文件具有不同的输出目录,因为它们将单独部署,因此它们在开发人员计算机上也是独立的
- 这 2 个可执行文件依赖于某些 DLL 程序集(它们可能相互依赖)
- 共有三个输出目录:
-
/x1用于可执行 1 项目 -
/x2用于可执行 2 项目 -
/lib用于所有 dll 程序集
-
DLL 程序集所有都将Copy Local设置为false,用于它们的项目引用,因为它们都构建到相同的输出目录。
这2个可执行项目已将它们直接引用的所有DLL程序集项目引用的Copy Local设置为true,以便将DLL复制到@分别为 987654336@/x2。
问题现在是 wrt。到可执行项目不直接引用但仅通过引用程序集传递的DLL:Will程序集,仅当“复制本地”在第一个程序集上设置为 true 时,通过另一个程序集传递引用,复制到可执行文件的输出文件夹?
例子:
-
x1.csproj(例如输出 =x1/one.exe)- 参考:
dlA.csproj(例如输出 =lib/a.dll)和Copy Local = *true* - (没有直接引用 b.dll)
- 参考:
-
dlA.csproj(例如输出 =lib/a.dll)- 参考:
dlB.csproj(例如输出 =lib/b.dll)和Copy Local = **false** - (没有直接引用 c.dll)
- 参考:
-
dlC.csproj(例如输出 =lib/c.dll)- (没有进一步的相关参考资料)
因此,我们有一个one.exe -> a.dll -> b.dll -> c.dll 的逻辑依赖关系,其中只有a.dll 显然被复制到one.exe 的输出目录。 其他两个 dll 是否也会被复制到输出目录? 这是否记录在某个地方?
而且,是的,我试过了。而且,是的,它似乎可以工作,但我还没有足够努力地戳它,无论如何,我可能错过了更多的东西。 (还有任何官方文档的问题。)
【问题讨论】:
-
@Albireo - 来自您提议的欺骗:“所有项目引用都具有 CopyLocal = true。” ...我确实没有有这个。所以这不可能是一个欺骗问题?
-
我在使用 AutoMapper 时遇到了同样的问题,它使用 .NET 4 代码的附属程序集。 AutoMapper 在类库项目中被引用,并且在构建我们的 Web 应用程序时,从不复制附属程序集除非我们在类库项目中使用了它的一些代码。
-
问题在于Visual Studio如何计算依赖图,Copy Local设置对这个问题没有影响。当我遇到这个问题时,我发现了一个详细的帖子来解释这个问题,但我现在找不到它,这个问题是我能找到的更接近的东西。
-
嗯...记录了一个
ResolveAssemblyReference任务。也许进一步研究可以对此有所了解......
标签: c# .net visual-studio msbuild copy-local