4

我有一个名为 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”值?

谢谢

4

2 回答 2

4

那是因为 msbuild能够找到c.dll。它对B项目的复制本地设置一无所知。它只是查看 b.dll 元数据中的 .assembly 指令,并发现 c.dll 是一个依赖项。如果它可以找到 c.dll 然后它会复制它。如果它找不到它,那么什么都不会发生,也不会抱怨。

奇怪的部分和您的解决方案是 c.dll 与 b.dll 存在于同一目录中。它是如何到达那里的?只需阻止它被复制到那里,它也不会被复制到 A 构建目录。否则,您期望它如何运行是非常模糊的。

于 2011-01-17T13:20:02.897 回答
3

这是因为CopyLocal将引用的程序集及其依赖项复制到输出文件夹,除非引用的程序集或依赖项位于 GAC 中

由于您在 referenced 上进行了设置CopyLocal,因此即使您没有在项目中的 referenced 上设置B,两者B及其依赖项C也将被复制到的输出文件夹中。ACopyLocalCB

请注意,如果您构建BC不会复制到B的输出文件夹。

如果您想B复制到A的输出文件夹但不希望同样的情况发生在 中C,一种解决方案是放入CGAC。

于 2011-01-17T11:40:45.047 回答