解决依赖项目

时间:2013-03-15 10:18:56

标签: c# visual-studio-2010 msbuild

msbuild和Visual Studio似乎以不同方式解决项目依赖关系:解决方案文件包含主可执行文件的项目,以及可执行文件依赖的dll的一些项目。其中一个dll项目取决于另一个不属于解决方案的项目。

只是为了展示这种情况下的主要参与者,以及一种简单的方法来重现它: 解决方案包含ExeProject和MainDllProject,MainDllProject依赖于SubDllProject,它不是解决方案的一部分(但在文件系统的同一层次结构中)。 ExeProject依赖于MainDllProject的MainDllProjectClass1(该类不依赖于SubDllProject;只有MainDllProjectClass2依赖于SubDllProject,但它不被ExeProject和MainDllProjectClass1使用):

Solution
    ExeProject
        Form1 (depends on MainDllProject.MainDllProjectClass1)
    MainDllProject
        MainDllProjectClass1
        MainDllProjectClass2 (depends on SubDllProject.SubDllProjectClass)
Not part of the solution
    SubDllProject
        SubDllProjectClass

使用Visual Studio 2010构建解决方案时,它会失败:无法构建MainDllProject,因为找不到SubDllProject。

使用msbuild构建解决方案时,构建成功。奇怪的是,尽管参数/ p:Configuration = Release。

,但仍构建了SubDllProject的调试版本

msbuild的日志文件大约是374 kB,你有一些提示如何分析吗?我想了解它为什么要构建SubDllProject,为什么它是调试版本,以及如何防止在未引用时构建它(我希望解决方案包含所有引用的项目,并且当忘记依赖项时,我想看到错误信息。)

注意:这种情况类似于Visual studio build non-dependent projects in solution,但反过来说...... 我从http://blogs.msdn.com/b/visualstudio/archive/2010/12/21/incorrect-solution-build-ordering-when-using-msbuild-exe.aspx了解到msbuild将sln文件转换为自己的格式 - 但是sln.metaproj文件也没有显示对SubDllProject的任何引用。

1 个答案:

答案 0 :(得分:0)

是的,我刚刚经历了一个非常类似的问题 我们在版本控制的同一目录中有一堆解决方案,其中一些共享项目。我们更改了项目A以引用解决方案1中的项目B,但忘记了解决方案2也使用项目A,但不包括项目B.

msbuild碰巧在构建时发现了Project B,因为路径引​​用已经解析为真实的东西,但显然没有在解决方案中构建它的说明,所以使用了默认值(debug)。

长话短说;如果您有多个项目引用多个共享项目的解决方案,请确保所有解决方案都包含所有项目。