MSBuild APIを使おうとした。まず.NET系のAPIなのでC#でプロジェクトを作る。.NET Framework 4.8.1が必要。
プロジェクトを作ったら右クリック→NuGet パッケージの管理へ行き、
・Microsoft.Build
・Microsoft.Build.Locator
をインストール。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.Build.Locator; using Microsoft.Build.Evaluation; namespace Project4 {
internal class Class1 { static void Main(string[] args) { // Microsoft.Build.dllのロードを行うので、最初に実行しておく必要がある。 MSBuildLocator.RegisterDefaults(); // 何を置いても先にMicrosoft.Build.dllをロードしておかなければいけないが、 // Class1の中でnew Project()をすると、Class1のJITが実行されたタイミング(プログラム実行前)に // Microsoft.Build.dllがロードされる。 // すると // 1. JITによるMicrosoft.Build.dllのロード // 2. MSBuildLocator.RegisterDefaults()によるMicrosoft.Build.dllのロード // の順番になり、ランタイムエラーとなる。 // それを避けるため、Projectクラスを使うのはMyUseProjectクラスに移動している。 // // これによりMyUseProjectが使われるこの時点で // new Project()を含むコードがJITされるため、順序の問題が解消される。 MyUseProject.Run(); // 待機 Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } }
internal class MyUseProject { public static void Run() { // プロジェクトファイルを読み込み var project = new Project("ConsoleApp1-MSBuildAPI.csproj"); // プロジェクトのプロパティを取得 var ret = project.GetPropertyValue("TargetFramework"); // プロパティの値を表示 Console.WriteLine($"TargetFramework: {ret}"); } }
}