我正在编写一个Web服务,调用时应该构建一个C#项目。我正在使用框架2参考,Microsoft.Buld.Engine和Microsoft.Build.Framework。如果您查看'< Import>'部分.csproj文件,默认情况下它有:
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
然后我改为:
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
构建csproj的代码是:
Engine buildEngine = new Engine(Path.Combine(Environment.GetEnvironmentVariable("SystemRoot"), @"Microsoft.NET\Framework\v2.0.50727"));
FileLogger logger = new FileLogger();
logger.Parameters = @"logfile=c:\temp\build.log";
buildEngine.RegisterLogger(logger);
bool success = buildEngine.BuildProjectFile([Path_Of_Directory]+ "ProjectName.csproj");
buildEngine.UnregisterAllLoggers();
成功变量返回false,因为构建失败。然后我检查build.log文件,这是我收到的错误:
Build build 3/17/2010 11:16:56 AM 项目 “[Path_Of_Directory] \ ProjectName.csproj” (默认目标):目标 GetFrameworkPaths:找不到 .NET Framework SDK。任务是 寻找.NET的路径 该位置的Framework SDK 在SDKInstallRootv2.0中指定 注册表项的值 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework。 您或许可以解决问题 通过执行以下操作之一:1。) 安装.NET Framework SDK。 2.) 手动将上面的注册表项设置为 正确的位置。目标
我无法理解它为什么不会建造。任何帮助都感激不尽。感谢
答案 0 :(得分:4)
使用/ToolsVersion:3.5
根据http://blogs.msdn.com/b/msbuild/archive/2006/11/15/multi-targeting-how-does-it-work.aspx
ToolsVersion是用于强制使用特定工具集构建项目的参数。
答案 1 :(得分:1)
您可以尝试通过构建此项目来验证SDK路径:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="GetPath">
<GetFrameworkSdkPath>
<Output
TaskParameter="Path"
PropertyName="SdkPath" />
</GetFrameworkSdkPath>
<Message Text="$(SdkPath)"/>
</Target>
</Project>
我可能错了,但您看到的路径 C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 似乎不正确。
它应该是C:\ Program Files \ Microsoft Visual Studio 8 \ SDK \ v2.0 \或C:\ Program Files \ Microsoft SDKs \ Windows \ v6.0A。
答案 2 :(得分:1)
在进一步调查中,我找到了错误的真正原因。回顾一下我正在创建的应用程序:
这是在框架3.5中创建的Web服务,试图构建使用框架2开发的C#项目。
当添加两个引用,Microsoft.Buld.Engine和Microsoft.Build.Framework时,您会注意到每个版本有两个版本。一个版本是框架2版本,一个是框架3.5版本。由于我尝试构建的项目是在框架2中完成的,因此我导入了框架2版本。这就是错误所在。
解决方案: BinPath应该是框架二的唯一引用,即:“C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727”。 Microsoft.Buld.Engine和Microsoft.Build.Framework应该指向3.5版本,因为构建应用程序的应用程序是在框架3.5中开发的。我想如果它是在框架2中开发的,我首先就不会遇到问题。
答案 3 :(得分:1)
从C:\ Program Files \ Reference Assemblies \ Microsoft \ Framework \ v3.5 \ Microsoft.Build.Engine.dll中找到Assemply。 复制 和 过去进入GAC位置如下所述:
C:\的Windows \组件\ GAC_MSIL \ Microsoft.Build.Engine \ 3.5.0.0__b03f5f7f11d50a3a
它正在运作。由于GAC文件丢失问题。