Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态代码生成_C#_.net_Reflection_Code Generation_Codedom - Fatal编程技术网

C# 动态代码生成

C# 动态代码生成,c#,.net,reflection,code-generation,codedom,C#,.net,Reflection,Code Generation,Codedom,我目前正在开发一个应用程序,您可以使用它创建“程序”,而无需编写源代码,只要单击并播放即可 现在的问题是如何从数据模型生成可执行程序。有很多可能性,但我不确定哪一个对我来说是最好的。我需要生成具有类和命名空间的程序集,以及可以作为应用程序一部分的所有内容 CodeDOM类:我听说这个类有很多限制和bug。我需要在方法参数和返回值上创建属性。这是否得到支持 以编程方式创建C#源代码,然后在其上调用CompileAsemblyFromFile:这将起作用,因为我可以生成我想要的任何代码,并且C#支持

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

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

  • CodeDOM类:我听说这个类有很多限制和bug。我需要在方法参数和返回值上创建属性。这是否得到支持

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

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

  • 还有其他可能的解决办法吗

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

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


    动态计算的另一个选项是
    表达式
    类;尤其是在.NET 4.0中,这是一种非常通用的方法,允许对委托进行编译。

    这取决于您的需求,CodeDOM当然最适合存储在“数据模型”中的“程序”


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

    进行C#源生成,在速度重要之前不要关心速度。C#编译器相当快。

    我的发现是,看看它或多或少是为创建基于.NET的高级语言而设计的,这是很有价值的


    也许还值得一看前面的一些文章,其中包含一些有用的链接,指向使用DSL的工具,这听起来有点像您正在计划的内容,尽管我还不完全清楚您的目标到底是什么。

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

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

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

    我会附和其他人的观点:1)编译器很快,2)“点击播放”应该足够简单,这样添加到一堆小部件中的单个小部件就不会使它成为非法的一堆


    祝你好运。除了真正的玩具级程序外,我怀疑你是否能达到第(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()。实际上,它是一个使用