当我构建一个包含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 - 好
对我来说看起来很奇怪。非常感谢。
答案 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版本进行编译。