在运行时运行MSBuild

时间:2011-02-22 15:41:04

标签: .net msbuild

我正在尝试从生成同一项目的两个版本的外部应用程序编译我的项目(使用编译常量)。

我使用此代码执行MsBuild:

string msBuildPath = Path.Combine(RuntimeEnvironment.GetRuntimeDirectory(), "msbuild.exe");
string projectPath = @"D:\NSM\NSM.csproj";     

var startInfo = new ProcessStartInfo(msBuildPath)
                                {
                                    Arguments = string.Format(@"/t:rebuild /p:Configuration=Release /p:DefineConstants=INTVERSION ""{0}""", projectPath),
                                    WorkingDirectory = Path.GetDirectoryName(msBuildPath),
                                    RedirectStandardOutput = true,
                                    RedirectStandardError = true,
                                    UseShellExecute = false
                                };
Console.WriteLine("> msbuild " + startInfo.Arguments);
var process = Process.Start(startInfo);
Console.Write(process.StandardOutput.ReadToEnd());
process.WaitForExit();

但是当我运行该程序时,我收到了这个错误:

  

找不到导入的项目“C:\ Microsoft.CSharp.targets”

我怎么解决?

由于

1 个答案:

答案 0 :(得分:3)

如果要打开NSM.csproj文件,您会看到如下所示的行:

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

问题是$(MSBuildToolsPath)属性未设置,因此您的项目路径变为\Microsoft.CSharp.targets,这就是您看到所描述的错误的原因。从Visual Studio IDE或VS命令提示符构建项目时,这不是问题,因为会自动为您设置导致此属性设置的适当环境。

因此,在VS环境之外,您需要确保在调用MSBuildToolsPath之前设置msbuildmsbuild将设置环境变量作为属性,因此一种方法是在开始msbuild之前通过此名称设置环境变量,例如:

Environment.SetEnvironmentVariable("MSBuildToolsPath", RuntimeEnvironment.GetRuntimeDirectory());