使用 Roslyn 在运行时编译 C# 代码



我检查了一些关于 roslyn 的资源,但我没有找到如何使用 Roslyn 将 c# 源代码编译为可执行文件.我可以轻松地使用 CodeDom 将一些.cs文件编译为.exe:

    /// <summary>
    /// "anycpu" || "anycpu32bitpreferred" || "x86" || "x64" || "ARM" || "Itanium"
    /// </summary>
    public static string param = "anycpu";
    public static string BCS(string[] sources,string[] libs,string outPath,bool exef)
    {
        var options = new Dictionary<string, string> {
         { "CompilerVersion", "v4.0.0" }
        };
        CSharpCodeProvider codeProvider = new CSharpCodeProvider(options);
        CompilerParameters parameters = new CompilerParameters(libs);
        parameters.GenerateExecutable = exef;
        parameters.OutputAssembly = outPath;
        parameters.CompilerOptions = "-platform:" + param;
        CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, sources);
        if (results.Errors.Count > 0)
        {
            string errsText = "";
            foreach (CompilerError CompErr in results.Errors)
            {
                errsText = "("+CompErr.ErrorNumber +
                            ")Line " + CompErr.Line +
                            ",Column "+CompErr.Column +
                            ":"+CompErr.ErrorText + "" +
                            Environment.NewLine;
            }
            return errsText;
        }
        else
        {
            return "Success";
        }
    }

但是CodeDom的问题 - 他只能使用.NET Framework 4.0编译C#,但我需要使用4.6.1 .NET Framework版本编译C#文件。那么,问题:我可以使用Roslyn Compiler编译一些带有4.6.1 .NET Framework版本的c#文件(.cs)吗?

CodeDom 已被弃用,取而代之的是 Roslyn API。在.NET Framework(即.NET 4.x)上,您可以继续使用CSharpCodeProvider,该提供程序使用内置编译器,如果内存可用,该编译器最多支持C#6。如果要使用高于此版本的 C# 版本,则需要使用 Roslyn,并且有一个使用 Roslyn 的填充码 CodeProvider,可让您访问更高版本的 C# 版本。

下面是使用带有 CodeDom 的"经典"提供程序或 Roslyn 提供程序的外观:

if (CompilerMode == ScriptCompilerModes.Roslyn)
    // NuGet Package: Microsoft.CodeDom.Providers.DotNetCompilerPlatform
    _compiler = new Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider();
else
    _compiler = new Microsoft.CSharp.CSharpCodeProvider();  // classic

最终,尽管 CodeProvider 接口已被弃用,但最好直接使用 Roslyn API。

在我的这篇文章中,有很多关于将旧CSharpCodeProvider与 Roslyn 一起使用和使用 Roslyn API 的更多信息。

相关内容

  • 没有找到相关文章

最新更新