.Net Core 2.1 中的动态代码编译

mon*_*nty 5 c# compilation dynamic .net-core

有没有人设法找到一种解决方法/方法来将一个文件或多个文件或文本动态编译为 .Net Core (2.1) 中的 .dll?

        var csProvider = CodeDomProvider.CreateProvider("CSharp");
        CompilerResults compilerResults = csProvider.CompileAssemblyFromFile(options, files); 
Run Code Online (Sandbox Code Playgroud)

导致 PlatformNotSupportedException 并且似乎 CodeDom 在 .Net Core 中的用途非常有限。查看类似的抱怨并比较.Net Core 2.1.Net Framework 4.7.2中 System.CodeDom.Compiler 的视图。

我们需要能够在现场编写和动态编译自定义代码。我有一种动态加载任何结果 .dll 的方法,但我只需要首先能够获取该 .dll。

目前我能看到的唯一解决方法是创建一个 .Net Framework api/service 来执行此操作。是这里唯一放弃 .Net Core 并转到 .Net Framework 的其他解决方案吗?

注意:我想在代码库中动态执行此操作。因此,“是否可以使用 .net 核心 Roslyn 编译器编译单个 C# 代码文件?”的解决方案 不相关,因为它指出:“要直接调用 Roslyn 编译器,必须使用命令行驱动程序”,这会使我完全走上错误的道路。但是“如何以编程方式使用 Roslyn 编译 C# 文件?” 如果我知道这就是我想要做的,我会提供解决方案。

@Sami Kahmonem 提供的链接到Joel Martinez 在 .Net Core 1 中的解决方案是我用来解决这个问题的。

kae*_*ker 3

有两种选择供您选择。

  1. 使用 Roslyn 脚本 API (Microsoft.CodeAnalysis.CSharp.Scripting)。这非常简单,而且速度快得惊人。此外,您也不会将任何二进制文件写入文件系统。

  2. 使用完整编译器创建 DLL 并加载它。如果可能的话我不建议这样做。

有关详细说明,您应该查看这个问题:Compiling and Running code at running in .Net Core 1.0(您不需要创建 NuGet.config 或类似的内容)