MSBuild正确构建具有项目引用的项目,但不是来自解决方案

时间:2009-06-16 12:46:50

标签: .net msbuild

当我构建一个包含2个项目Bssproj和C.csproj的A.sln时,它有内部项目引用,它会在MSBuild中抛出引用错误。但是当我在MSBuild中单独构建B.csproj和C.csproj时,它不会抛出错误。而且在VS IDE中构建A.sln也不会抛出错误。我正在使用.NET 2.0框架。请在下面找到用于构建sln和projs的脚本。

MSBuild "<path>/A.sln" /p:Configuration=Release /p:StartupObject="" /p:WarningLevel=4 /p:Optimize=true /t:rebuild /l:Filelogger,Microsoft.Build.Engine;logfile=F:\A.sln.log /verbosity:normal

MSBuild "<path>/B.csproj" /p:Configuration=Release /p:StartupObject="" /p:WarningLevel=4 /p:Optimize=true /t:rebuild /l:Filelogger,Microsoft.Build.Engine;logfile=F:\B.csproj.log /verbosity:normal 

MSBuild "<path>/C.csproj" /p:Configuration=Release /p:StartupObject="" /p:WarningLevel=4 /p:Optimize=true /t:rebuild /l:Filelogger,Microsoft.Build.Engine;logfile=F:\C.csproj.log /verbosity:normal 

编辑:

抛出的所有错误都来自缺少引用的代码(都是项目引用)。我只得到三种类型的错误,如下所示。

  

错误CS0012:定义了类型“X”   在未引用的程序集中。   您必须添加对程序集的引用   'Y,Version = 2.0.0.0,Culture = neutral,   公钥= aad4cbe5d7c27078' 。

     

错误CS0234:类型或命名空间   名称'X'不存在于   命名空间'Y'(你错过了吗?   装配参考?)

     

错误CS0246:类型或命名空间   找不到名字'X'(是吗?   缺少使用指令或   装配参考?)

在从IDE和MSBuild构建之前,我从构建路径中清除了所有以前构建的dll。但IDE只是工作正常,并没有在项目的“参考”部分显示参考缺失指示器。

IDE中没有手动添加引用路径。

另一个更新:

我刚刚注意到,当我从解决方案中打开两个项目时,引用正确指向IDE。但是,当我在IDE中单独打开项目时,我提到的缺失引用在MSBuild中出现了。非常奇怪。

总结一下,

  

MSBuild中的Buiilding .proj - 好

     

IDE中的Buiilding .proj - 错误

     

MSBuild中的Buiilding .sln - 错误

     

IDE中的Buiilding .sln - 好

对我来说看起来很奇怪。非常感谢。

5 个答案:

答案 0 :(得分:8)

MSBuild和VS都使用项目引用和项目依赖项来选择解决方案构建顺序。除此之外,它是未定义的 - 通常两者之间不同。检查这两个是否正确。项目依赖项在解决方案的属性中设置。 如果这不起作用,请仔细检查项目中项目引用中的GUID是否与解决方案中的GUID相匹配。有时重新创建解决方案可以解决它们。

答案 1 :(得分:4)

对我来说,当我遇到这个(或类似的)问题时,手动检查(和修复)guids排队修复了我的问题。在.sln和.csproj文件之间追踪guid是很烦人的,但它确实有效。

我通常删除项目引用并重新添加它,这解决了问题(一旦我找到了令人讨厌的不匹配的guid)。也许我应该先尝试一下。这更容易。

答案 2 :(得分:3)

需要考虑的一些事项:在IDE中构建解决方案与在.sln文件上运行MSBUILD不同。您可以尝试使用devenv.exe / rebuild A.sln。 IDE会播放几个游戏以允许构建.sln文件,包括创建一个“等效的”MSBUILD风格的项目。

此外,IDE不会直接生成MSBUILD命令。两者之间存在相互作用以提高性能。例如,项目中的CSC任务可能正在IDE中执行,而不是像MSBUILD那样生成单独的命令行构建。

您还应该考虑从http://technet.microsoft.com/sysinternals/获取Process Monitor,以便查看正在访问的文件。

答案 3 :(得分:1)

正如Jon Skeet所提到的,错误信息有助于了解问题所在。但是,如果没有任何细节,如果它在IDE中构建但不在MSBuild中构建,则听起来您可能在项目中引用了在构建解决方案的路径中不可用的DLL。也许您手动将它们复制到IDE可以找到的地方,或者您在IDE中设置了参考路径以查找某个文件夹。

当你在问题上得到其他细节时,可以检查一下。

编辑:现在有一些细节,可能是构建问题的顺序。项目B中是否有项目参考到项目C?如果是这样,您可能只需要在项目B之前更改订单以构建项目C.

答案 4 :(得分:1)

从GAC中删除程序集(C:\ WINDOWS \ assembly文件夹 - 选择您的组合并右键单击并卸载)。

因为解决方案使用guid保持引用,如果guid在GAC中,它将继续使用GAC版本进行编译。