1

我正在编写一个 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();

由于构建失败,success 变量返回 false。然后我检查 build.log 文件,这是我收到的错误:

构建开始于 2010 年 3 月 17 日上午 11:16:56 项目“[Path_Of_Directory]\ProjectName.csproj”(默认目标):目标 GetFrameworkPaths:找不到 .NET Framework SDK。该任务正在注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework 的 SDKInstallRootv2.0 值中指定的位置查找 .NET Framework SDK 的路径。您可以通过执行以下操作之一来解决该问题: 1.) 安装 .NET Framework SDK。2.) 手动将上述注册表项设置到正确的位置。目标

我不明白为什么它不会建立。任何帮助都感激不尽。谢谢

4

4 回答 4

4

使用 /ToolsVersion:3.5

根据http://blogs.msdn.com/b/msbuild/archive/2006/11/15/multi-targeting-how-does-it-work.aspx

ToolsVersion 是用于强制项目使用特定工具集构建的参数。

于 2010-11-29T06:40:08.383 回答
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。

于 2010-03-17T10:19:48.160 回答
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 中开发的,我一开始就不会遇到问题。

于 2010-03-18T12:55:37.087 回答
1

你可以这样尝试:

从 C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\Microsoft.Build.Engine.dll 中找到 Assemply。如下所述复制并粘贴到 GAC 位置:

C:\Windows\assembly\GAC_MSIL\Microsoft.Build.Engine\3.5.0.0__b03f5f7f11d50a3a

它正在工作。由于GAC文件丢失的问题。

于 2011-12-26T10:24:40.273 回答