スポンサーリンク

MSBuild API

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}");
        }

    }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: