C# 动态代码生成
我目前正在开发一个应用程序,您可以使用它创建“程序”,而无需编写源代码,只要单击并播放即可 现在的问题是如何从数据模型生成可执行程序。有很多可能性,但我不确定哪一个对我来说是最好的。我需要生成具有类和命名空间的程序集,以及可以作为应用程序一部分的所有内容C# 动态代码生成,c#,.net,reflection,code-generation,codedom,C#,.net,Reflection,Code Generation,Codedom,我目前正在开发一个应用程序,您可以使用它创建“程序”,而无需编写源代码,只要单击并播放即可 现在的问题是如何从数据模型生成可执行程序。有很多可能性,但我不确定哪一个对我来说是最好的。我需要生成具有类和命名空间的程序集,以及可以作为应用程序一部分的所有内容 CodeDOM类:我听说这个类有很多限制和bug。我需要在方法参数和返回值上创建属性。这是否得到支持 以编程方式创建C#源代码,然后在其上调用CompileAsemblyFromFile:这将起作用,因为我可以生成我想要的任何代码,并且C#支持
DataTable
等,尽管这不是我的首选)作为值,等等
动态计算的另一个选项是
表达式
类;尤其是在.NET 4.0中,这是一种非常通用的方法,允许对委托进行编译。这取决于您的需求,CodeDOM当然最适合存储在“数据模型”中的“程序”
然而,与任何其他方法相比,使用选项2不太可能以任何方式明显较慢。进行C#源生成,在速度重要之前不要关心速度。C#编译器相当快。我的发现是,看看它或多或少是为创建基于.NET的高级语言而设计的,这是很有价值的
也许还值得一看前面的一些文章,其中包含一些有用的链接,指向使用DSL的工具,这听起来有点像您正在计划的内容,尽管我还不完全清楚您的目标到底是什么。当我编写动态代码生成器时,我非常依赖System.Reflection.Emit 基本上,您可以通过编程方式创建动态程序集并向其添加新类型。这些类型是使用发射构造(属性、事件、字段等)构造的。在实现方法时,必须使用ILGenerator将MSIL操作代码输出到方法中。这听起来非常可怕,但您可以使用一些工具来帮助:
- 预构建的示例实现
- ILDasm检查示例实现的操作代码
祝你好运。除了真正的玩具级程序外,我怀疑你是否能达到第(2)点。你能举例说明将由此创建的“程序”类型吗?我已经更新了问题,请看我的编辑。我仍然看不到你想要实现什么-是像DSL一样的东西,还是你想创建一种运行在C#上的通用高级编程语言?是的-一种运行在.NET上的通用高级编程语言(不一定是C#)。它的级别并不比c#高,因为我没有抽象出任何复杂性/概念,而是抽象出语法。虽然它只是点击播放,但用户可以为它创建真实的类和成员,但我也需要良好的性能,因此我必须创建“真实”的代码。对于表达式,我只能生成表达式,因此我必须将其与codeDOM?或动态程序集一起使用。我做过很多动态代码,但我从来没有使用过codeDOM,所以你建议用表达式和动态Assemles来代替codeDOM?这会导致类似的(运行时)性能吗?您是否有关于如何以这种方式生成程序集的Web链接?表达式更适合于单个方法,但是:InfoQ:,或者我的博客:非常有趣,但是您在博客中说,在.NET 4.0之前,不可能使用带有语句体的表达式。我需要控制结构、try/catch/finally语句以及所有的语句,所以仅仅使用表达式是不够的。我的自动完成功能也依赖于编译的程序集,所以它是一种实时的^^^^^你可以将每个类编译成自己的程序集。但是如果源代码生成和编译不比codeDOM慢,我在问我自己,为什么有些东西会需要代码,因为它是非常有缺陷和有限的。我想知道你的信息来源,它是“非常有缺陷”和有限的。CodeDOM的目的之一是允许设计人员使用单个模型创建代码,然后将CodeDOM转换为VB或CS或宿主项目使用的任何语言。CODEDOM也在工作流基础中使用,以创建一个语言无关的规则文件。请参阅:特别是,我建议在DLR网站上查看Syr.DOC()。实际上,它是一个使用