在运行时编译和使用类

gil*_*ly3 2 c# code-generation metaprogramming

我正在开发一种规则引擎,用户将规则定义为一组条件和操作.然后将这些条件和操作解析为要执行的代码.我能够毫无问题地生成代码.我坚持编译它然后加载类.

如何获取一串动态生成的源代码并在运行时编译它?

那我怎么能执行那段代码呢?

我设想能够有一个静态的规则列表,这些规则将在添加规则时更新.就像是:

static Dictionary<string, Rule> Rules { get; set; }
static void RefreshRules ()
{
    var newRules = DataLayer.GetRules().Where(r => !this.Rules.ContainsKey(r.Name));
    foreach (var rule in newRules)
    {
        this.Rules[rule.Name] = CompileRule(rule.Code);
    }
}
Run Code Online (Sandbox Code Playgroud)

或者我会重新编译一个程序集,然后将其重新加载到我已经运行的应用程序中?

Mar*_*ari 5

我建议您使用表达式树而不是动态编译代码.

编译某些源代码时,生成的程序集会粘贴到主应用程序中,并且不能再分离.这会导致内存使用量增加,并导致潜在的危险行为.表达树是专为像你的目标创建的.