5

我目前正在开发一个应用程序,您可以在其中创建“程序”而无需编写源代码,如果您愿意,只需单击并播放。

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

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

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

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

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

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

4

6 回答 6

4

您会发现查看动态语言运行时是值得的,它或多或少是为创建基于 .NET 的高级语言而设计的。

也许还值得看一些以前关于领域特定语言的 Stack Overflow 线程,其中包含一些有用的链接到使用 DSL 的工具,这听起来有点像你的计划,尽管我仍然不完全清楚这个问题是什么正是你的目标。

于 2009-11-17T11:50:02.083 回答
2

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

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

于 2009-11-17T11:17:37.907 回答
1

进行 C# 源代码生成,在重要之前不要关心速度。C# 编译器非常快。

于 2009-11-17T11:23:03.747 回答
1

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

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

  • 预构建的示例实现
  • ILDasm 检查示例实现的操作码。
于 2009-11-17T18:43:19.717 回答
0

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

然而,与任何其他方法相比,使用选项 2 不太可能以任何方式明显变慢。

于 2009-11-17T11:18:30.527 回答
0

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

祝你好运。我怀疑除了真正的玩具级程序之外,您是否可以实现第 (2) 点。

于 2009-11-24T15:43:28.307 回答