DLL文件复制到一个项目的bin目录,而不是另一个项目的bin目录?

时间:2011-07-27 21:46:41

标签: visual-studio-2010 reference shared-libraries projects-and-solutions

我有一个包含2个项目的解决方案:ProjA和ProjB。 ProjA是一个应用程序,而ProjB是一个库。 ProjB还引用了3个其他DLL文件(C,D,E)。当我构建ProjB C,D和E都进入bin目录。当我编译ProjA(仅引用ProjB)时,只复制C和D,而不是E。

我真的不确定会导致这种情况发生的原因。我查看了引用属性,并且所有3(C,D和E)都是相同的(除了它们的名称和路径)。我想我不确定为什么ProjB会将E放入bin目录,但是当我的应用程序(ProjA)构建时,它不会在本地复制E?

1 个答案:

答案 0 :(得分:1)

我打算在这里做一个疯狂的猜测:项目B不直接使用参考E,因此参考不会出现在项目B输出的PE清单中。

可能您在项目B中的引用上有“复制本地”,这解释了为什么将这些程序集复制到项目B的bin文件夹中。

但是,如果要打开项目B的dll,您会注意到引用E未列为程序集依赖项。 Visual Studio / MSBuild无法推断项目A对程序集B 的使用需要E。

要解决此问题,请在项目B中使用参考E的类或功能。

或者,有项目A& B将其程序集输出到公共文件夹。提示:在此方案中关闭“复制本地”以提高构建性能。


<强>更新

我尝试了几种不同的方法来重现你的问题,但我最接近的是post which suggests that it may be a path probing problem。在提供的示例中,从A到B的引用是静态文件引用(bin \ Debug \ ProjB.dll),依赖项(E)定义为Copy Local = False。示例项目的设置方式是所有依赖项都已编译并打包在zip中。

编译A时,您所描述的问题是显而易见的。修复,应该是将ProjB的E引用更改为“Copy Local = True”,但是如果你进行了这个更改并重新编译 - 没有区别!为什么呢?

似乎更改“复制本地”设置实际上并没有以任何方式改变ProjB的输出。并且因为ProjB中的引用是静态引用,所以它不会发现任何已发生的更改。直到你做一个Clean,构建才能正常编译。

不知道这是否有帮助。祝你好运。