动态代码生成

时间:2009-11-17 11:11:49

标签: c# .net reflection code-generation codedom

我目前正在开发一个应用程序,您可以使用它创建“程序”而无需编写源代码,只需点击并播放即可。

现在的问题是如何从我的数据模型生成可执行程序。有很多可能性,但我不确定哪一个对我最好。我需要生成具有类和命名空间的程序集以及可以作为应用程序一部分的所有内容。

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

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

  3. 使用反射ILGenerator类:我想我可以生成所有可能的.NET代码。但我认为这比其他方法更复杂,更容易出错?

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

  5. 编辑: 该工具通常用于开发应用程序,它不限于特定域。我不知道它是否可以被视为可视化编程语言。用户可以创建类,方法,方法调用,各种表达式。它不会非常限制,因为您应该能够完成实际编程语言中允许的大多数事情。 目前,用户仍然必须将许多内容写成文本,但最终的目标是,几乎所有内容都可以一起点击。

6 个答案:

答案 0 :(得分:4)

我发现,查看Dynamic Language Runtime或多或少是为基于.NET创建高级语言而设计的是有益的。

也许值得看一下之前的Stack Overflow threads on Domain Specific Languages,其中包含一些有用的工具链接,这听起来有点像你的计划,尽管我仍然不是很清楚这个问题究竟是什么目的。

答案 1 :(得分:2)

大多数事情“点击和播放”应该足够简单,只是将一些预定义的构建块对象粘在一起(可能使用边界上的接口)。含义:您可能不需要动态生成代码 - 只需“伪造它”。例如,使用属性包对象(如DataTable等,虽然这不是我的首选),但值等等。

动态评估的另一个选项是Expression类;特别是在.NET 4.0中,这是非常通用的,并允许编译给代表。

答案 2 :(得分:1)

做C#源代码并且在关注速度之前不关心速度。 C#编译器非常快。

答案 3 :(得分:1)

当我编写动态代码生成器时,我非常依赖System.Reflection.Emit。

基本上,您以编程方式创建动态程序集并向其中添加新类型。这些类型是使用Emit构造(属性,事件,字段等)构造的。在实现方法时,您必须使用ILGenerator将MSIL操作码输出到您的方法中。这听起来非常可怕,但您可以使用一些工具来提供帮助:

  • 预构建的示例实现
  • ILDasm检查示例实现的操作码。

答案 4 :(得分:0)

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

然而,与任何其他方法相比,使用选项2的可能性会明显减慢。

答案 5 :(得分:0)

我会回应其他人1)编译器很快,2)“点击播放”的东西应该足够简单,以便没有一个小部件添加到一堆小部件可以使它成为非法堆。

祝你好运。我怀疑你可以获得积分(2),除了真正的玩具级别的程序。