2010-03-17 84 views
1

我正在编写一个webservice,调用时应构建一个C#项目。我使用框架2引用,Microsoft.Buld.Engine和Microsoft.Build.Framework。如果你看 '<导入>' 部分.csproj的文件下,默认情况下它具有:Microsoft.Build.Engine错误(默认目标):目标GetFrameworkPaths:找不到.NET Framework SDK

<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,因为构建faild。然后我检查build.log文件,这是我收到的错误:

构建开始3/17/2010上午11时16分56秒 项目 “[Path_Of_Directory] ​​\ ProjectName.csproj” (默认目标):目标 GetFrameworkPaths:找不到 .NET Framework SDK。任务是 正在寻找通向.NET Framework SDK的路径,位置 在注册表项 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework的值中指定。 通过执行以下操作之一,您可能能够解决问题 :1.) 安装.NET Framework SDK。 2.) 手动将上述注册表项设置为 正确的位置。目标

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

+0

你究竟有什么不明白的?错误消息告诉你到底要检查什么。是你做的吗? – TomTom 2010-03-17 09:23:34

+0

是的,注册表值是“C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727”,这与我通过的bin路径完全相同,因此我的困境 – 2010-03-17 09:30:15

回答

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 \框架\ V2.0.50727你看到似乎不正确。它应该是C:\ Program Files \ Microsoft Visual Studio 8 \ SDK \ v2.0 \或C:\ Program Files \ Microsoft SDKs \ Windows \ v6.0A。

+0

腓特烈,你让我更接近我回答。这是正确的binpath文件夹,但.csprof文件引用了另一个项目而不是它的.dll,并且正在binpath文件夹中搜索项目,因此出现了错误。我删除了对项目的引用,并在被引用的项目的bin文件夹中添加了对dll的引用,并且它可以工作。 – 2010-03-17 11:37:25

1

在进一步调查中,我发现了错误的真正原因。回顾一下在我创建的应用程序:

它在框架3.5试图建立一个C#项目中创建一个Web服务使用开发框架2.

当一个人将两个refrences,Microsoft.Buld.Engine和微软.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中开发的,那么我首先就不会有任何问题。

1

你可以尝试这样的方式:

找到Assemply从C:\ Program Files文件\参考大会\微软\框架\ v3.5版本\ Microsoft.Build.Engine.dll。 复制 和 过去到GAC位置如下所述:

C:\ WINDOWS \装配\ GAC_MSIL \ Microsoft.Build.Engine \ 3.5.0.0__b03f5f7f11d50a3a

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