我有一个名为A.dll的程序集,它有一个名为B.dll的程序集的项目引用。引用B.dll的程序集具有对C.dll的二进制引用。
A.dll - > B.dll - > C.dll
我已将A.dll的B的“Copy Local”设置为true,并且我已将B.dll的“Copy Local”设置为C.dll的false。
无论如何,当我构建A.dll时,我在结果文件夹中以C.dll结尾。为什么不考虑B.dll的“复制本地”值到C.dll?
由于
答案 0 :(得分:4)
那是因为msbuild 能够找到 c.dll。它对B项目的复制本地设置一无所知。它只是查看b.dll元数据中的.assembly指令,并发现c.dll是一个依赖项。如果它能找到c.dll那么它会复制它。如果找不到,那么没有任何反应,也没有投诉。
奇怪的部分和您的解决方案是c.dll与b.dll存在于同一目录中。它是怎么到达那里的?只是阻止它被复制到那里,它也不会被复制到A build目录。如果您期望这种情况发生,那么它是非常模糊的。
答案 1 :(得分:3)
这是因为CopyLocal
将引用的程序集及其依赖项复制到输出文件夹,除非引用的程序集或依赖项驻留在GAC中。
由于您在引用的CopyLocal
上设置了B
,因此B
及其依赖项C
都将被复制到A
的输出文件夹中,即使您未在CopyLocal
项目中引用的C
上设置B
。
请注意,如果您构建B
,C
不已复制到B
的输出文件夹。
如果您希望将B
复制到A
的输出文件夹,但又不希望C
发生同样的情况,那么一个解决方案就是C
在GAC中。