2

是否可以将 C# 用作 DSL,其中 C# 源代码由最终用户在 TextBox 中编辑,在应用程序运行时编译,然后由已经运行的应用程序调用?

我问是因为在接下来的几个月里,我将需要实现一个简单的数学运算 DSL(类似于 Rachel Lim 在http://rachel53461.wordpress.com/2011/08/20/the-math-converter上写的博客/ 我专注于她代码的数学处理方面,而不是 XAML/转换器方面)。我不会仅仅重用她的代码,因为我想添加 if 语句和可能的其他功能。如果我可以使用 C# 本身,那么我无需重新实现即可获得所有功能。

如果可以做到这一点,我想用什么框架或命名空间或类来完成这个?

请注意,我会对 C# 派生的 DSL 做的一件事是硬编码所有必要的 using 标头语句,然后删除精明的用户输入的所有 using 语句。这样做的目的是减少最终用户试图将我的类 C# DSL 用于不符合其企业策略的意愿或站点管理员不知情的成熟编译器的可能性。 我提议的使用语句管理是否足以防御用户的恶作剧?

最后,如果到目前为止所有的答案都是“是”,那么这种方法的缺点是什么,尤其是引入安全漏洞的缺点?

保罗

4

3 回答 3

4

我提议的使用语句管理是否足以防御用户的恶作剧?

不,您还必须删除对完全限定类的引用。然后,用户仍然可以使用反射来访问他们没有以任何方式引用的类。

您需要创建一个单独的 appdomain 来包含用户的代码,然后您可以适当地对其进行沙箱处理。这是 MSDN 上的一篇相关文章,深入解释了这个过程。

于 2012-10-18T22:40:41.970 回答
1

删除 using 指令将无济于事,除非您还找到了一些阻止用户编写的方法,例如System.Diagnostics.Process.Start("evilprogram.exe"). 这样做(同时不阻止属性访问)将需要您使用 C# 解析器。

但是,您可能可以为此使用代码访问安全性。

于 2012-10-18T22:38:39.873 回答
1

Stackoverflow 现在自动将链接答案转换为评论。多么可爱。

编译运行动态代码,不生成EXE?

无论如何,答案在于Microsoft.CSharp.CSharpCodeProvider

于 2012-10-18T22:41:51.063 回答