在运行时执行MSBuild

4

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

我使用以下代码执行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个回答

3
如果您打开您的NSM.csproj文件,您将看到如下一行:
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

问题在于未设置$(MSBuildToolsPath)属性,因此您的项目路径变为\Microsoft.CSharp.targets,这就是为什么您看到所描述的错误。当从Visual Studio IDE或VS命令提示符构建项目时,这不是问题,因为自动为您设置了导致该属性被设置的适当环境。
因此,在VS环境之外,您需要确保在调用msbuild之前设置了MSBuildToolsPathmsbuild将获取设置的环境变量作为属性,因此一种方法是在启动msbuild之前通过此名称设置环境变量,例如:
Environment.SetEnvironmentVariable("MSBuildToolsPath", RuntimeEnvironment.GetRuntimeDirectory());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接