csharp C#からMsBuildをコードで実行(Microsoft.Build名前空间,BuildManager)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了csharp C#からMsBuildをコードで実行(Microsoft.Build名前空间,BuildManager)相关的知识,希望对你有一定的参考价值。
namespace Samples.MsBuildExec
{
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Build.BuildEngine;
using Microsoft.Build.Evaluation;
using Microsoft.Build.Execution;
using Microsoft.Build.Framework;
/// <summary>
/// アプリケーションメインクラスです。
/// </summary>
internal class Program
{
/// <summary>
/// アプリケーションメインエントリポイントです。
/// </summary>
internal static void Main()
{
new Program().Execute().Wait();
Utils.WriteLine("なにかキーを押すと終了します....");
Utils.WaitUserInput();
}
/// <summary>
/// 処理を実行します。
/// </summary>
/// <returns>
/// <see cref="Task" />オブジェクト
/// </returns>
/// <exception cref="Exception">
/// 処理中にエラーが発生した場合
/// </exception>
internal async Task Execute()
{
//
// MsBuildをコードから実行する場合
// 予め以下のDLLを参照設定しておく必要がある。
// ・Microsoft.Build.dll
// ・Microsoft.Build.Engine.dll
// ・Microsoft.Build.Framework.dll
//
//
// 結果フォルダ作成
//
var destDir = DateTime.Now.ToString("yyyyMMddHHmmss");
Utils.CreateResultDirectory(destDir);
var cursorLeft = 0;
var cursorTop = 0;
var startBuildSignal = new ManualResetEventSlim();
var cancelSource = new CancellationTokenSource();
var cancelToken = cancelSource.Token;
//
// 処理中をコンソールに表示するためのタスク
// ビルドが開始されたタイミングでこのタスクも出力を初める
//
var showProcessingMarkTask = Task.Run(
async () =>
{
startBuildSignal.Wait(cancelToken);
do
{
if (cancelToken.IsCancellationRequested)
{
break;
}
Utils.SetCursorPosition(cursorLeft, cursorTop);
Utils.Write("★★処理中★★");
await Task.Delay(TimeSpan.FromSeconds(1), cancelToken);
if (cancelToken.IsCancellationRequested)
{
break;
}
Utils.SetCursorPosition(cursorLeft, cursorTop);
Utils.Write(" ");
await Task.Delay(TimeSpan.FromSeconds(1), cancelToken);
}
while (true);
},
cancelToken);
//
// ビルドを実行するタスク
//
var buildTask = Task.Run(
() =>
{
//
// ビルド時の構成をマップで指定
//
var prop = new Dictionary<string, string>();
prop.Add("Configuration", Utils.MsBuildConfiguration);
prop.Add("Platform", Utils.MsBuildPlatform);
//
// ビルドリクエストを構築
//
var targets = Utils.MsBuildTargets.Split(new[] { "," }, StringSplitOptions.None);
var request = new BuildRequestData(Utils.SlnFilePath, prop, null, targets, null);
//
// ビルドパラメータを構築
// パラメータ構築時にログファイル設定が行える
//
var projCollection = new ProjectCollection();
var parameter = new BuildParameters(projCollection);
parameter.Loggers = new List<ILogger> { new FileLogger { Parameters = Utils.MsBuildLogFileName } };
Utils.Write("ビルド開始....");
Interlocked.Exchange(ref cursorLeft, Utils.CursorLeft);
Interlocked.Exchange(ref cursorTop, Utils.CursorTop);
startBuildSignal.Set();
//
// 最後にビルド実行を行ってくれるManagerオブジェクトを取得し、ビルド実行
//
var manager = BuildManager.DefaultBuildManager;
var result = manager.Build(parameter, request);
//
// 結果はOverallResultプロパティで判定できる
//
if (result.OverallResult == BuildResultCode.Failure)
{
Utils.WriteLine(string.Empty);
Utils.WriteLine("ビルド失敗");
if (result.Exception != null)
{
Utils.WriteLine(result.Exception.ToString());
throw result.Exception;
}
throw new Exception("ビルドに失敗しました。");
}
Utils.WriteLine(string.Empty);
Utils.WriteLine("ビルド終了....");
});
try
{
await buildTask;
try
{
cancelSource.Cancel();
await showProcessingMarkTask;
}
catch (TaskCanceledException)
{
// noop
}
}
catch (Exception ex)
{
Utils.WriteLine("★★★★★ 処理中にエラーが発生しました ★★★★★");
Utils.WriteLine(ex.ToString());
cancelSource.Cancel();
return;
}
// 出力先をオープン
Process.Start(destDir);
}
}
}
以上是关于csharp C#からMsBuildをコードで実行(Microsoft.Build名前空间,BuildManager)的主要内容,如果未能解决你的问题,请参考以下文章
sh GitHubリリースページに実行バイナリの拉闸いている时,このコマンドでウンロードできる('·‿·`)#swift #CodePiece
ruby Macのクリップボードを监视して,设定されたファイル拡张子をwgetで実行フォルダにダウンロード。
markdown commitやpull request,issueをコミットメッセージから参照する
csharp 【C#】参考キーワードで参照型を参照渡しした时の挙动に关して
text VRTK3.0.1をUnity2017.4.2f2で実行すると表示されるエラーメッセージ。今のところ动作上は特に问题なさそう.http://negi-lab.blog.jp/Aete_VRT