代码之家  ›  专栏  ›  技术社区  ›  kitsune

动态关键字,C编译服务-如何运行编译时尚不可用的代码?

  •  0
  • kitsune  · 技术社区  · 15 年前

    我在WPF中编写了一个小的可视化工具,其思想是普通用户可以创建有趣的可视化,而不必成为编程向导。

    我有一个控制器类,它有startpath(double x,double y)和lineto(x,y)curveto(…)等方法。

    其思想是,用户可以将这些命令键入文本框,并让它在画布上绘制结果。

    StartPath(0,0);
    LineTo(30,50);
    LineTo(50,40);
    EndPath();
    

    我的一个想法是使用一个.cs模板,该模板实现了所有方法,并且有一个带有替换标记的额外run()命令。我将模板作为字符串加载,将用户命令插入run()方法,使用新的.NET 4.0编译服务动态创建程序集,然后加载并调用其run()方法,并访问公开的路径以在画布上绘制它。

    另一种方法是实际分析文本框,错误地检查它并调用适当的方法。

    有没有其他方法,特别是新的动态关键字?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Jon Skeet    15 年前

    您不需要使用任何来自.NET 4.0的新功能。在框架中编译C代码的能力已经存在很久了。事实上,我的snippy工具几乎完全按照你说的做——它是一个用户代码进入的模板。如果你愿意的话,欢迎你把你的工具放在我的基础上。您可以从下载代码 C# in Depth site .

    除此之外,这样就不需要用户使用.NET 4.0。

    至于 dynamic -在这种情况下,它并没有真正的帮助,除非您希望让您的用户用Ironpython/IronRuby编写代码。C仍然没有“eval”调用,只允许执行任意字符串。

        2
  •  1
  •   Claudiu Mihaila    15 年前

    我认为你最好定义一个LL1语言,生成一个解析器和一个扫描器,并构建你自己的解释器。

    COCO/R是一种非常稳定和知名的工具,用于这种工作。 检查这一点对于你所想的不应该是困难的:

    http://www.scifac.ru.ac.za/coco/cshcoco.htm

    如果您想使用新的动态特性,那么解析输入命令文本时仍然会遇到问题。 您可以使用dynamic在解析器之上构建解释器。

    希望这有帮助