如何在不使用命令提示符的情况下使用MSBuild引擎构建多个c#项目?

时间:2018-02-16 16:09:17

标签: c# msbuild windows-applications

我正在开发Windows应用程序项目,并希望在该项目中构建不同的多个c#项目,这些项目位于visual studio 2015的一个解决方案中,并且还希望使用programmatically工具单独构建MSBuild不使用命令提示符,最后想在日志文件中显示输出而不是在命令提示符下(意味着那些项目正在构建成功或在日志文件中出现此消息的任何错误)

我是否需要使用任何MSBuild API以及如何添加此项目?

我见过很多像这样的问题(不完全相同),但它对我没用。请有人帮我这个吗?

1 个答案:

答案 0 :(得分:1)

    using Microsoft.Build.Evaluation;
using Microsoft.Build.Execution;
using Microsoft.Build.Logging;

...
 public static BuildResult Compile(string solution_name, out string buildLog)
        {
                buildLog = "";
                string projectFilePath = solution_name;
                ProjectCollection pc = new ProjectCollection();
                Dictionary<string, string> globalProperty = new Dictionary<string, string>();
                globalProperty.Add("nodeReuse", "false");
                BuildParameters bp = new BuildParameters(pc);
                bp.Loggers = new List<Microsoft.Build.Framework.ILogger>()
                {
                    new FileLogger() {Parameters = @"logfile=buildresult.txt"}
                };
                BuildRequestData buildRequest = new BuildRequestData(projectFilePath, globalProperty, "4.0",
                    new string[] {"Clean", "Build"}, null);
                BuildResult buildResult = BuildManager.DefaultBuildManager.Build(bp, buildRequest);
                BuildManager.DefaultBuildManager.Dispose();

                pc = null;
                bp = null;
                buildRequest = null;

                if (buildResult.OverallResult == BuildResultCode.Success)
                {
                    Console.ForegroundColor = ConsoleColor.Green;
                }
                else
                {
                    if (Directory.Exists("C:\\BuildResults") == false)
                    {
                        Directory.CreateDirectory("C:\\BuildResults");
                    }
                    buildLog = File.ReadAllText("buildresult.txt");
                    Console.WriteLine(buildLog);
                    string fileName = "C:\\BuildResults\\" + DateTime.Now.Ticks + ".txt";
                    File.Move("buildresult.txt", fileName);
                    Console.ForegroundColor = ConsoleColor.Red;

                    Thread.Sleep(5000);
                }
                Console.WriteLine("Build Result " + buildResult.OverallResult.ToString());
                Console.ForegroundColor = ConsoleColor.Gray;
                Console.WriteLine("================================");




                return buildResult;

        }

这是我躺在的旧代码。 我使用它以编程方式构建解决方案和C#项目。输出将是BuildResult.Success或BuildResult.Failure。 变量buildLog将包含构建输出。 注意 - 访问我所知道的构建输出的唯一方法是使用上面生成日志文件的方法,然后在C#代码中读取它。

有一点需要注意,我从未找到过这方面的修复,是运行此代码的应用程序,可能会将dll从内存中的nuget包目录加载到内存中。这使删除这些目录成为问题。我找到了一个解决办法,让我的应用程序作为MS服务运行 - 它似乎作为本地服务运行时,它具有足够的权限来删除内存中保存的文件。