如何即时编译 C#7 代码?
How can I compile C#7 code on the fly?
我有一个简单的代码,我尝试即时编译:
namespace A
{
class Test
{
public static void Test()
{
int.TryParse("12", out int result);
}
}
}
通常我使用CSharpCodeProvider
或CodeDomProvider
。不幸的是,在过渡到 C#6/C#7 时,出现以下错误:
error CS1644: Feature `declaration expression' cannot be used because it is
not part of the C# 6.0 language specification
当然,整个代码确实包含 C#7 特性,它们编译得很好,使用 msbuild/xbuild。
我理解错误,但我不知道是否有任何其他方法可以编译这段代码?
重要通知 - 我在 Mono 上 运行 它,但我现在没有尝试 .Net 的选项。这可能是一个 Mono 问题,但它似乎是通用的。
错误消息似乎表明您正在使用的编译器版本可以理解声明表达式,但已设置为不允许它们。
Ubuntu 16.04 (Mono 4.2.1) 中最新版本的 Mono 中包含的 CodeDOM 版本就是这种情况。在该版本中,您可以通过设置 /langversion:experimental
.
来允许声明表达式
在 CodeDOM 中,您可以通过设置 CompilerParameters.CompilerOptions
来实现,例如:
compiler.CompileAssemblyFromSource(
new CompilerParameters { CompilerOptions = "/langversion:experimental" }, code);
使用此代码,您的源代码可以在 Mono 4.2.1 上为我编译。但由于它是此版本编译器的实验性功能,因此可能无法完美运行。
升级您的 Mono 版本可能会有所帮助。
我相信 /langversion:experimental
特定于 Mono,因此此代码可能不适用于 .Net 的其他实现。
我有一个简单的代码,我尝试即时编译:
namespace A
{
class Test
{
public static void Test()
{
int.TryParse("12", out int result);
}
}
}
通常我使用CSharpCodeProvider
或CodeDomProvider
。不幸的是,在过渡到 C#6/C#7 时,出现以下错误:
error CS1644: Feature `declaration expression' cannot be used because it is not part of the C# 6.0 language specification
当然,整个代码确实包含 C#7 特性,它们编译得很好,使用 msbuild/xbuild。
我理解错误,但我不知道是否有任何其他方法可以编译这段代码?
重要通知 - 我在 Mono 上 运行 它,但我现在没有尝试 .Net 的选项。这可能是一个 Mono 问题,但它似乎是通用的。
错误消息似乎表明您正在使用的编译器版本可以理解声明表达式,但已设置为不允许它们。
Ubuntu 16.04 (Mono 4.2.1) 中最新版本的 Mono 中包含的 CodeDOM 版本就是这种情况。在该版本中,您可以通过设置 /langversion:experimental
.
在 CodeDOM 中,您可以通过设置 CompilerParameters.CompilerOptions
来实现,例如:
compiler.CompileAssemblyFromSource(
new CompilerParameters { CompilerOptions = "/langversion:experimental" }, code);
使用此代码,您的源代码可以在 Mono 4.2.1 上为我编译。但由于它是此版本编译器的实验性功能,因此可能无法完美运行。
升级您的 Mono 版本可能会有所帮助。
我相信 /langversion:experimental
特定于 Mono,因此此代码可能不适用于 .Net 的其他实现。