我有一个名为 A.dll 的程序集,它有一个对名为 B.dll 的程序集的项目引用。引用 B.dll 的程序集具有对 C.dll 的二进制引用。
A.dll --> B.dll --> C.dll
我在 A.dll 中将 B 的“复制本地”设置为 true,在 B.dll 中将 C.dll 的“复制本地”设置为 false。
无论如何,当我构建 A.dll 时,我在结果文件夹中以 C.dll 结尾。为什么不考虑 B.dll 到 C.dll 的“Copy Local”值?
谢谢
那是因为 msbuild能够找到c.dll。它对B项目的复制本地设置一无所知。它只是查看 b.dll 元数据中的 .assembly 指令,并发现 c.dll 是一个依赖项。如果它可以找到 c.dll 然后它会复制它。如果它找不到它,那么什么都不会发生,也不会抱怨。
奇怪的部分和您的解决方案是 c.dll 与 b.dll 存在于同一目录中。它是如何到达那里的?只需阻止它被复制到那里,它也不会被复制到 A 构建目录。否则,您期望它如何运行是非常模糊的。
这是因为CopyLocal
将引用的程序集及其依赖项复制到输出文件夹,除非引用的程序集或依赖项位于 GAC 中。
由于您在 referenced 上进行了设置CopyLocal
,因此即使您没有在项目中的 referenced 上设置B
,两者B
及其依赖项C
也将被复制到的输出文件夹中。A
CopyLocal
C
B
请注意,如果您构建B
,C
则不会复制到B
的输出文件夹。
如果您想B
复制到A
的输出文件夹但不希望同样的情况发生在 中C
,一种解决方案是放入C
GAC。