如何在C#项目中设置"Copy Local Dependencies" [关于CopyLocal的问题]

4
我有一个名为A.dll的程序集,它引用了一个名为B.dll的程序集。被引用的B.dll程序集又引用了C.dll二进制文件。
A.dll --> B.dll --> C.dll
我将B的"Copy Local"设置为true,并将B的"C.dll"的"Copy Local"设置为false。
但是,当我构建A.dll时,最终文件夹中会出现C.dll。为什么没有考虑到B.dll的"Copy Local"值对C.dll的影响呢?
谢谢
2个回答

4
这是因为msbuild能够找到c.dll。它不知道B项目的复制本地设置,只是查看b.dll元数据中的.assembly指令并发现c.dll是一个依赖项。如果它能找到c.dll,那么就会将其复制。如果找不到,则什么也不会发生,也没有任何投诉。
奇怪的是,你的解决方案是将c.dll放在与b.dll相同的目录中。它是如何到达那里的?只需停止将其复制到该位置,它也不会被复制到A构建目录中。否则,你很难指望它能正常运行。

它将运行,因为我正在构建一组单元测试,并且我面临的问题是这些引用中我在输出文件夹中获取应用程序二进制文件,而我应该只有单元测试二进制文件(这样单元测试将针对目标机器上安装的应用程序运行)。我会检查你所说的内容,通常这对我很有帮助。 - Ignacio Soler Garcia
我们把所有的二进制文件都放在 R:\ 目录下,这样 MSBuild 就可以找到它们了。:\ - Ignacio Soler Garcia
你知道在哪里可以找到关于这种行为的信息吗? - Ignacio Soler Garcia
1
当然是从stackoverflow.com上获取的。只有一些msbuild .targets文件的行为被记录下来。你可以自己研究它们以了解它们的作用。 - Hans Passant

3
那是因为CopyLocal会将被引用的程序集及其依赖项复制到输出文件夹,除非被引用的程序集或依赖项位于GAC中。
由于你在被引用的B上设置了CopyLocal,因此无论是否在B项目中设置了对CCopyLocalB和其依赖项C都会被复制到A的输出文件夹中。
请注意,如果构建B,则C不会被复制到B的输出文件夹中。
如果您想将B复制到A的输出文件夹中,但不希望同样发生在C上,一种解决方案是将C放入GAC中。

糟糕,我无法这样做,因为我们的构建机器存在问题,并且构建机器策略包括不安装任何东西到 GAC。我真的需要一种改变这种行为的方法(使用 vcprojs 我没有这个问题,因为我可以将 CopyLocalDependencies 属性设置为 false)。 - Ignacio Soler Garcia
@SoMoS,这可能是一个愚蠢的想法,但也许你可以在B的后期构建事件中将C从输出文件夹中删除,因为它已经被复制了? - Frédéric Hamidi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接