を使用してプログラムでターゲット プロジェクトをコンパイルしたい
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;
}
}
}