我想使用
以编程方式编译目标项目Microsoft.Build.Evaluation.Project.Build()
如果我需要编译的目标项目包含C#
6.0功能,例如安全导航操作符(?.
运算符),则会在这些代码行中准确地给出错误。
如果我在目标项目中删除这些代码行,它编译得很好。
有没有人知道如何以编程方式编译C#
6.0和7.0样式代码?
构建构建Microsoft.Build.dll
的运行时版本的项目是v4.0.30319,.Net
框架版本是4.6.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);
}
}
}
}
应编译的targetproject:
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;
}
}
}
答案 0 :(得分:0)
我终于找到了解决方法。
在编译项目的引用中,请不要使用Microsoft.Build和Microsoft.Build.Framework的标准.net程序集。 让对Microsoft.Build和Microsoft.Build.Framework的引用指向随着安装Visual Studio而安装的构建引擎中的相应dll。
在f.i的默认安装中。 VS2017的建筑引擎位于: C:\ Program Files(x86)\ MSBuild \ 14.0 \ Bin \
所以通过从那里选择Microsoft.Build.dll和Microsoft.Build.Framework.dll来添加项目中的引用
此解决方法无法解决上述问题。我认为问题是由于引入C#6和7后,.Net Microsoft Build库从未被重新编程
答案 1 :(得分:0)
如果您安装了MS Build
2015(或来自here),您将看到磁盘上的15.0
文件夹,之后使用exe
- 文件,问题应该得到解决(为我工作)。