动态代码生成

5

我正在开发一个应用程序,你可以在其中创建“程序”,而不需要编写源代码,只需点击&play即可。

现在的问题是,如何从我的数据模型中生成可执行程序。有很多可能性,但我不确定哪种对我来说最好。我需要生成包含类和命名空间等内容的程序集,这些内容可以是应用程序的一部分。

  1. CodeDOM类:我听说过这个类的许多限制和错误。我需要在方法参数和返回值上创建属性。这受支持吗?

  2. 以编程方式创建C#源代码,然后调用CompileAssemblyFromFile:这将起作用,因为我可以生成任何我想要的代码,并且C#支持大多数CLR功能。但这会很慢吗?

  3. 使用反射ILGenerator类:我认为通过这个我可以生成每一个可能的.NET代码。但我认为这比其他方法更加复杂和容易出错?

  4. 还有其他可能的解决方案吗?

编辑: 该工具是用于开发应用程序的通用工具,它没有特定的领域限制。我不知道它是否可以被视为可视化编程语言。用户可以创建类、方法、方法调用和各种表达式。它不会非常限制,因为您应该能够做到在真实编程语言中允许的大多数事情。 目前,许多东西仍然必须由用户作为文本编写,但最终目标是几乎所有内容都可以通过单击组合。


你能举个例子说明将会从这里创建哪些“程序”类型吗? - o.k.w
我仍然不能真正看到你想要实现什么 - 是类似DSL还是你试图创建在C#上运行的通用高级编程语言? - glenatron
是的 - 一种通用的高级编程语言,运行在.NET上(不一定是c#)。它并不比c#更高级,因为我没有将任何复杂性/概念抽象化,而是将语法抽象化。 - codymanix
6个回答

4

1
特别是,我建议查看DLR网站上的syml.doc(http://dlr.codeplex.com/Project/Download/FileDownload.aspx?DownloadId=74709)。实际上,它是使用表达式树和DLR创建自己的简单语言的演示。 - Alexandra Rusina

2
大多数“点按并播放”功能应该足够简单,只需将一些预定义的构建块对象组合在一起(可能使用边界上的接口)。这意味着:您可能不需要进行动态代码生成-只需“模拟”。例如,使用属性包对象(如 DataTable 等,尽管这不是我的首选)来存储值等。
另一个用于动态评估的选项是 Expression 类;特别是在.NET 4.0中,它非常灵活,并允许编译为委托。

虽然这只是一个点击和播放的过程,但用户可以为其创建真实的类和成员。我也需要良好的性能,因此必须创建“真正”的代码。 使用表达式,我只能生成表达式,所以我必须将其与codeDOM一起使用? - codymanix
或者使用动态程序集。我已经做了很多动态代码,但我从未使用过 codeDOM。 - Marc Gravell
您建议使用Expression和Dynamic assemlies来替换CodeDOM吗?这样做是否会导致类似(运行时)性能?您有生成此类程序集的网址吗? - codymanix
表达式更适用于个别方法,但是可以参考InfoQ:http://www.infoq.com/articles/expression-compiler,或者我的博客:http://marcgravell.blogspot.com/search/label/expression。 - Marc Gravell
非常有趣,但是你在博客中说,在.NET 4.0之前,带有语句主体的表达式将不可行。仅仅表达式对我来说是不够的,因为我需要控制结构、try/catch/finally语句和整个一堆东西。 - codymanix

1
进行C#源代码生成,直到速度成为问题之前不必担心。C#编译器非常快。

我的自动补全功能也将依赖于已编译的程序集,因此它必须是实时的 ^^ - codymanix
你可以将每个类编译成自己的程序集。 - erikkallen

1
当我编写动态代码生成器时,我非常依赖于System.Reflection.Emit。
基本上,您可以通过编程方式创建动态程序集并向其中添加新类型。这些类型使用Emit结构进行构造(属性、事件、字段等)。当涉及到实现方法时,您将不得不使用ILGenerator将MSIL操作码注入到您的方法中。听起来非常可怕,但您可以使用一些工具来帮助:
  • 预先构建的示例实现
  • ILDasm来检查示例实现的操作码。

0

这取决于您的需求,如果您需要将“程序”存储在“数据模型”中,CodeDOM肯定是最合适的选择。

然而,与任何其他方法相比,使用选项2不太可能在任何方面表现出明显的速度差异。


但是如果源代码生成和编译不比codeDOM慢,我就在想为什么还需要codeDOM呢,因为它非常容易出错且功能有限。 - codymanix
我对你关于它“非常有缺陷”和“受限制”的信息来源很感兴趣。CodeDOM 的目的之一是让设计人员使用单一模型创建代码,然后将 CodeDOM 转换为 VB、CS 或主机项目所使用的任何语言。CodeDOM 还用于诸如工作流基础结构之类的东西中,以创建语言无关的规则文件。 - AnthonyWJones
请点击此处查看:http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/61552792-76a9-45f0-8ea9-99d2f8b6f6f0 - codymanix

0

我想和其他人一样说,1)编译器很快,2)“点一下即可播放”的内容应该足够简单,以至于任何添加到小部件堆中的小部件都不会使其成为非法堆。

祝你好运。我怀疑除了真正的玩具级别程序外,你能否实现第二点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接