【发布时间】:2013-04-15 23:25:41
【问题描述】:
我们希望为用户提供一种图形格式来设计一些数据的条件语句。我们的应用程序将采用该图形格式,将其转换为 C#,对其进行编译,然后针对某些数据运行条件语句,并返回一个布尔值。
需要注意的是,这些条件语句需要在运行时编写和编译(当然,还需要执行),因为我们不会在每次用户创建新的条件语句时都重新构建应用程序。
我们考虑过使用 LINQ 表达式树,但编译后的 LINQ 表达式树无法保存,这意味着每次执行条件语句时都需要重新编译。
我们认为更好的选择是使用 CodeDOM 将条件语句编译为 .dll(它们将被转换为静态类的静态方法,该静态类将数据作为参数运行条件语句) .这允许我们保存编译后的语句,并且我们可以在运行时加载和卸载 .dll。此外,生成 C# if 语句比生成 LINQ 表达式树更容易。
或者,我们可以使用 Roslyn 来生成 .dll。据报道,这比 CodeDOM 快,但 Roslyn 仍在 CTP 中。
是否存在我们应该知道的隐藏陷阱或执行此操作的一般模式?除了非常小心地只生成对数据进行测试的函数(并且不修改数据或允许调用任何其他函数)之外,我们还应该注意什么?加载和卸载(可能数百个)这些 .dll 会导致问题吗?如果每个 .dll 都有自己唯一的命名空间,那么加载和卸载(可能有数百个)它们会留下工件吗?
【问题讨论】:
-
您可以考虑利用运行时表达式评估器,例如FLEE 或NCalc。它们很容易启动和运行,您可以轻松地让它们执行一些用户定义的谓词,并且您可以(通常)将用户代码限制为仅您希望公开的 API(以减少恶意使用的可能性) .编辑:这是一个使用 FLEE 生成
DateTime值的快速示例;返回bool是微不足道的:stackoverflow.com/questions/14730219/… -
克里斯是个好主意。可能有更好的性能,甚至可能有一些安全/沙盒,以保护您的进程免受错误 C# 的用户的侵害(即使只是偶然的)。这两件事都可能需要做很多工作才能做好。不过,出于对这种解决方案的一般方法的好奇,我仍然有兴趣看到对您问题的深思熟虑的答案。
-
您没有调查 Windows 工作流程的任何特殊原因?设计器可以嵌入到您的应用程序中。 msdn.microsoft.com/en-us/library/aa480213.aspx
-
再来一个
Chris,我们会在这里彻底糊涂。
标签: c# .net roslyn dynamic-compilation