c# - 是否可以动态编译和执行C#代码片段?

标签 c# compilation dynamic-compilation

我想知道是否可以将 C# 代码片段保存到文本文件(或任何输入流),然后动态执行?假设提供给我的内容可以在任何 Main() block 中正常编译,是否可以编译和/或执行此代码?出于性能原因,我更愿意编译它。

至少,我可以定义一个他们需要实现的接口(interface),然后他们会提供实现该接口(interface)的代码“部分”。

最佳答案

C#/所有静态 .NET 语言中的最佳解决方案是使用 CodeDOM对于这样的事情。 (请注意,它的另一个主要目的是动态构建代码位,甚至整个类。)

这是一个很好的简短示例,来自 LukeH's blog ,它也使用一些 LINQ 只是为了好玩。

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.CSharp;
using System.CodeDom.Compiler;

class Program
{
    static void Main(string[] args)
    {
        var csc = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });
        var parameters = new CompilerParameters(new[] { "mscorlib.dll", "System.Core.dll" }, "foo.exe", true);
        parameters.GenerateExecutable = true;
        CompilerResults results = csc.CompileAssemblyFromSource(parameters,
        @"using System.Linq;
            class Program {
              public static void Main(string[] args) {
                var q = from i in Enumerable.Range(1,100)
                          where i % 2 == 0
                          select i;
              }
            }");
        results.Errors.Cast<CompilerError>().ToList().ForEach(error => Console.WriteLine(error.ErrorText));
    }
}

这里最重要的类是 CSharpCodeProvider,它利用编译器动态编译代码。如果您想随后运行代码,只需使用一点反射来动态加载程序集并执行它。

Here是 C# 中的另一个示例,它(虽然稍微不够简洁)还向您精确地展示了如何使用 System.Reflection 命名空间运行运行时编译的代码。

关于c# - 是否可以动态编译和执行C#代码片段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39426920/

相关文章:

java - 使用 Jython 编译应用程序

c# - 基本 C# 语法问题

c# - 使用 Linq 在 Epplus 工作表中选择分组的最大值和最小值

c# - 当我尝试在 Excel 工作表上运行查询时出现 "Invalid bracketing of name"错误

vb6 - 如何减小VB6编译后的可执行文件的大小?

swift - 导入框架构建以在 Swift REPL 中进行测试失败?

使用 AoT 的 Angular 5 动态模板

c# - 相同类型对象的 InvalidCastException - 自定义控件加载

c# - #定义从C到C#的转换

java - 生成动态类 Java