2

を使用してプログラムでターゲット プロジェクトをコンパイルしたい

Microsoft.Build.Evaluation.Project.Build()  

コンパイルが必要なターゲット プロジェクトにC#、安全なナビゲーション オペレーター ( ?.Operator) などの 6.0 機能が含まれている場合、これらのコード行で正確にエラーが発生します。
ターゲット プロジェクトでこれらのコード行を削除すると、正常にコンパイルされます。

C#6.0 および 7.0 スタイルのコードをプログラムでコンパイルする方法を知っている人はいますか?
私のランタイム バージョンをビルドするプロジェクトでは、ビルドのバージョンMicrosoft.Build.dllは v4.0.30319 で、.Netフレームワークのバージョンは 4.6.2 です。

2 つの単純なプロジェクトを追加しました。最初のコンソール プロジェクトは、コンパイルされるコードです。2 番目のコンソール プロジェクトは、コンパイルされるターゲット プロジェクトです。行 15 をコメントアウトすると、コンパイルは成功します。そうしないと、ログファイルのその行にエラーが表示されます。

コンパイルするプロジェクト

using System;
using Microsoft.Build.Logging;


namespace CompilerApp
{
  class Program
  {
    static void Main(string[] args)
    {
        string projectfile = @"C:\temp\CompilerApp\MyCSharp7\MyCSharp7.csproj";

        UnloadAnyProject();
        Microsoft.Build.Evaluation.Project p = new Microsoft.Build.Evaluation.Project(projectfile);
        FileLogger loggerfile2 = new FileLogger();
        loggerfile2.Parameters = @"logfile=C:\temp\CompilerApp\myapp.msbuild.log";
        bool buildresult = p.Build(loggerfile2);
        if (buildresult)
        {
            Console.WriteLine("project compiled");
        }
        else
        {
            Console.WriteLine("project not compiled, check {0}", @"C:\temp\myapp.msbuild.log");

        }
        p.Save();
        UnloadAnyProject();
    }

    private static void UnloadAnyProject()
    {
        Microsoft.Build.Evaluation.ProjectCollection projcoll = Microsoft.Build.Evaluation.ProjectCollection.GlobalProjectCollection;

        foreach (Microsoft.Build.Evaluation.Project pr in projcoll.LoadedProjects)
        {
            Microsoft.Build.Evaluation.ProjectCollection mypcollection = pr.ProjectCollection;
            mypcollection.UnloadProject(pr);
        }
    }
  }
}

コンパイルするターゲット プロジェクト:

using System;
namespace MyCSharp7
{
  class Program
  {
    static void Main(string[] args)
    {
        Console.WriteLine("truncate {0}", Truncate("Hello", 3));
    }

    public static string Truncate(string value, int length)
    {
        //csharp 6/7
        //comment out line below for succesfull compilation
        return value?.Substring(0, Math.Min(value.Length, length));

        // csharp<6
        string result = value;
        if (value != null) // Skip empty string check for elucidation
        {
            result = value.Substring(0, Math.Min(value.Length, length));
        }
        return result;
    }
  }
}
4

2 に答える 2