首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用C#作为我的DSL --这可能吗?如果可能的话,怎么做?

使用C#作为我的DSL --这可能吗?如果可能的话,怎么做?
EN

Stack Overflow用户
提问于 2012-10-18 22:33:10
回答 3查看 273关注 0票数 2

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

我之所以这样问,是因为在接下来的几个月里,我需要实现一个简单的数学运算DSL (类似于瑞秋·林在http://rachel53461.wordpress.com/2011/08/20/the-math-converter/上的博客,我关注的是她代码的数学处理方面,而不是XAML/转换器方面)。我倾向于仅仅重用她的代码,因为我想添加if-语句,并可能添加其他特性。如果我可以使用C#本身,那么我就可以获得所有的特性,而不必重新实现它们。

如果可以这样做,我希望使用什么框架、名称空间或类来完成这些任务?

请注意,我对C#派生的DSL所做的一件事是硬编码所有必要的使用头语句,然后删除所有使用语句输入的精明的用户。这样做的目的是减少最终用户试图利用我的C#类DSL成为一个完全成熟的编译器的可能性,这违背了他们的企业策略的意愿,或者没有站点管理员的知识。是我提议的使用语句的管理,是防止用户恶作剧的充分防御措施吗?

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

保罗

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-18 22:41:51

Stackoverflow现在会自动将链接答案转换为注释。那太好了。

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

不管怎样,答案在于Microsoft.CSharp.CSharpCodeProvider

票数 1
EN

Stack Overflow用户

发布于 2012-10-18 22:40:41

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

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

您需要创建一个单独的appdomain,以包含用户的代码,然后您可以适当地使用沙箱。这里有一篇关于MSDN的相关文章,它深入地解释了这个过程。

票数 4
EN

Stack Overflow用户

发布于 2012-10-18 22:38:39

删除使用指令不会有帮助,除非您还找到了一些方法来阻止用户编写例如System.Diagnostics.Process.Start("evilprogram.exe")。这样做(同时也不阻止属性访问)将要求您使用C#解析器。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12964790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档