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

5

有没有人成功地找到了一种解决方法/方式,可以在 .Net Core (2.1) 中将文件、文件或文本动态编译成 .dll?

        var csProvider = CodeDomProvider.CreateProvider("CSharp");
        CompilerResults compilerResults = csProvider.CompileAssemblyFromFile(options, files); 

在 .Net Core 中,使用 CodeDom 会导致 PlatformNotSupportedException 异常,因此其实用性非常有限。请参考类似的投诉并比较 .Net Core 2.1.Net Framework 4.7.2 中 System.CodeDom.Compiler 的视图。

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

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

注意:我希望在代码库内动态处理这个问题。因此,"是否可以使用.NET Core Roslyn编译器编译单个C#代码文件?" 的解决方案无关紧要,因为它声明:“必须使用命令行驱动程序来直接调用Roslyn编译器”,这会把我引入完全错误的方向。但是,如果我知道自己要做什么,“如何使用Roslyn以编程方式编译C#文件?”将提供解决方案。
@Sami Kahmonem提供的链接.Net Core 1中Joel Martinez的解决方案是我用来解决这个问题的。

4
也许你可以通过Roslyn来实现?https://github.com/joelmartinez/dotnet-core-roslyn-sample - Sami Kuhmonen
是的,Roslyn是正确的选择。 - Matěj Štágl
1个回答

3
您有两个选项:
  1. 使用Roslyn Scripting API(Microsoft.CodeAnalysis.CSharp.Scripting)。这非常简单且惊人地快速。您也不需要将任何二进制文件写入文件系统。

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

要获取详细说明,请查看此问题:Compiling and Running code at runtime in .Net Core 1.0(您不需要创建NuGet.config或类似的内容)。

如何使用Roslyn API创建C#项目? - DioBrando
@DioBrando 如果你是指像 dotnet new 的模板,可以看一下 https://learn.microsoft.com/en-us/dotnet/core/tutorials/cli-templates-create-item-template - kaesaecracker
对于任何因Roslyn一词而感到厌烦或受到威胁的人,请知道如果您已经编写了可以与CodeDomProvider一起使用的代码,则只需很少的工作即可将其转换为Roslyn可以使用的内容。此处提供的链接具有示例源代码,应该很容易看到如何进行转换(或者至少对我来说是这样的。也许我只有一个非常简单的情况,但我怀疑大多数项目都像我的一样简单)。 - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接