是否可以使用C#作为DSL,其中C#源代码由TextBox中的最终用户编辑,在应用程序运行时编译,然后由已经运行的应用程序调用?
我之所以这样问,是因为在接下来的几个月里,我需要实现一个简单的数学运算DSL (类似于瑞秋·林在http://rachel53461.wordpress.com/2011/08/20/the-math-converter/上的博客,我关注的是她代码的数学处理方面,而不是XAML/转换器方面)。我倾向于仅仅重用她的代码,因为我想添加if-语句,并可能添加其他特性。如果我可以使用C#本身,那么我就可以获得所有的特性,而不必重新实现它们。
如果可以这样做,我希望使用什么框架、名称空间或类来完成这些任务?
请注意,我对C#派生的DSL所做的一件事是硬编码所有必要的使用头语句,然后删除所有使用语句输入的精明的用户。这样做的目的是减少最终用户试图利用我的C#类DSL成为一个完全成熟的编译器的可能性,这违背了他们的企业策略的意愿,或者没有站点管理员的知识。是我提议的使用语句的管理,是防止用户恶作剧的充分防御措施吗?
最后,如果到目前为止所有的答案都是“是的”,那么这种方法的缺点是什么,特别是引入安全漏洞的缺点?
保罗
发布于 2012-10-18 22:41:51
发布于 2012-10-18 22:40:41
我提议的使用语句的管理是否足以防御用户的恶作剧?
不是的。您还必须删除对完全合格类的引用。然后,用户仍然可以使用反射来访问他们没有以任何方式引用的类。
您需要创建一个单独的appdomain,以包含用户的代码,然后您可以适当地使用沙箱。这里有一篇关于MSDN的相关文章,它深入地解释了这个过程。
发布于 2012-10-18 22:38:39
删除使用指令不会有帮助,除非您还找到了一些方法来阻止用户编写例如System.Diagnostics.Process.Start("evilprogram.exe")。这样做(同时也不阻止属性访问)将要求您使用C#解析器。
但是,您可能会为此使用代码访问安全性。
https://stackoverflow.com/questions/12964790
复制相似问题