- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
使用 Reflection.Emit 库与 CodeDOM 在运行时动态生成代码有哪些优缺点?
我正在尝试根据运行时以 XML 形式提供的元数据在系统中生成一些(相对复杂的)动态类。我将生成扩展应用程序集中现有类的类,实现额外的接口(interface),添加方法,并覆盖虚拟和抽象成员。
我想确保在深入实现之前选择了合适的技术。有关这些不同的代码生成技术有何不同的任何信息都会有所帮助。此外,任何有关简化或流线化使用任一 API 的开源库的信息也很有用。
最佳答案
我认为关于 CodeDOM 和 Reflection.Emit 的关键点如下:
CodeDom 生成 C# 源代码,通常在生成要作为解决方案的一部分并在 IDE 中编译的代码时使用(例如,LINQ to SQL 类、WSDL、XSD都是这样工作的)。在这种情况下,您还可以使用分部类来自定义生成的代码。它的效率较低,因为它生成 C# 源代码,然后运行编译器来解析它(再次!)并编译它。您可以使用循环等相对高级的构造(类似于 C# 表达式和语句)生成代码。
Reflection.Emit 生成一个 IL,因此它直接生成一个程序集,该程序集也只能存储在内存中。结果效率更高。您必须生成低级 IL 代码(值存储在堆栈中;循环必须使用跳转来实现),因此生成任何更复杂的逻辑都有点困难。
总的来说,我认为 Reflection.Emit 通常被认为是在运行时生成代码的首选方式,而在编译前生成代码时首选 CodeDOM。在您的场景中,它们可能都可以正常工作(尽管 CodeDOM 可能需要更高的权限,因为它实际上需要调用 C# 编译器,这是任何 .NET 安装的一部分)。
另一种选择是使用 Expression
class .在 .NET 4.0 中,它允许您生成等效于 C# 表达式和语句的代码。但是,它不允许您生成类。因此,您可以将其与 Reflection.Emit 结合使用(以生成将实现委托(delegate)给使用 Expression
生成的代码的类)。对于某些场景,您可能真的不需要完整的类层次结构——通常是动态生成的委托(delegate)字典,例如 Dictionary<string, Action>
可能已经足够好了(当然,这取决于您的具体情况)。
关于c# - Reflection.Emit 与 CodeDOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2366921/
我使用 visual studio 发布选项向我的主机发布了我的网站。 我的主机使用 asp.net 4.5.1 框架。 它在本地运行良好,但在我发布之后,却出现了这个错误。 我的本地 visua
这是一个使用VS2015的WebApi项目。 重现步骤: 创建一个空的 WebApi 项目 将构建输出路径从“bin\”更改为“bin\Debug\” 运行 在我将构建输出路径从“bin\”更改为“b
我正在调查 System.CodeDom namespace用于独立于语言(至少在一定范围内)的源代码生成,我发现一些信息不鼓励使用 CodeDom . 我认为 this early blogpost
有人知道如何使用 CodeDom 调用基类的泛型方法吗? 我调用标准方法没有问题,但我找不到调用泛型的解决方案。 我用来调用标准基类方法 GetInstance 的代码: CodeAssignStat
如何使用 CodeDom 生成调用其他类 Constructor 的代码我找不到任何 CodeConstructorInvokeExpression。 最佳答案 我相信您正在寻找CodeObjectC
我有一个在 C# 中使用 WPF 的程序,它使用 .NET 4 Framework(不是客户端配置文件),它编译了一个名为“Source.txt”的源文件。但是,无论何时编译它,我都会收到此错误“错误
我需要向 CodeNamespace 添加一个类 (Type)。我已经编写了一个 C# 类,但我不想将其手动转换为 CodeDOM。有没有办法将现有的加载到 CodeTypeDeclaration。
我正在使用 CodeDom 生成稍后要编译的代码,并且我注意到某些结构会创建额外的括号集。虽然我知道它们不会影响任何东西,但它们看起来确实很奇怪。 执行此操作的代码示例是这样的: new CodeCo
我想为我的应用程序构建一个构建器,这是构建器的来源 using System; using System.Collections.Generic; using System.ComponentMode
我正在尝试使用 CodeDom 生成一些方法,但在为这些方法生成自定义属性时遇到问题。 我可以管理简单的空属性,比如 [DataMember()] 或带有字符串值参数的属性, [DataContrac
有没有办法使用 C# CodeDom 生成字典初始值设定项?这些是否受支持? 我想要: private IDictionary map = new Dictionary { { "Name",
在 visual studio 中,我可以单击“引用”>“添加引用”并从我的计算机浏览到现有的 .dll 文件。然后我可以按如下方式使用引用的 dll: dllNameSpace.dllClassNa
如标题所示,我正在尝试使用 CodeDom 在 C# 的数组中“嵌套”或创建数组。 这是我要复制的行: T.Invoke(null, new object[] { new string[] {} }
我有一个使用 CodeDom 创建的属性。如何将其设置为自动属性,而不是针对私有(private)成员添加 CodeFieldReferenceExpressions? 最佳答案 IIRC,CodeD
有没有办法用 CodeDom 生成类约束。 因为当我使用类似的东西时 var method = new CodeMemberMethod(); var genericParam = new CodeT
好的,我觉得我的问题的答案在网上,但我找不到。我要做的就是将一个文本资源文件添加到我正在使用 CodeDom 编译的程序中,然后在已编译的程序中访问该文本文件。为了添加嵌入式资源,我使用了以下代码:
我正在寻找为使用 codeDOM 生成的 exe 文件设置文件版本的任何方法。我的始终显示为 0.0.0.0。以编程方式显然是首选,但在这一点上,有总比没有好。 最佳答案 编译程序集的版本由 Asse
我从 SE 找到了使用 CodeDOM 的类名验证方法,并使用了它: System.CodeDom.Compiler.CodeGenerator.IsValidLanguageIndependentI
是否可以仅使用常规 .NET 中的 System.CodeDom 创建 Silverlight 应用程序(.xap 文件、testpage.html、ClientBin 旁边的内容资源、浏览器外设置等
在 StackExchange 上有几个与此类似的问题,但它们并未涵盖完全相同的情况。请在将其标记为重复之前通读它! 在 C# 中使用 CodeDom,我试图为字典生成一个初始化表达式。例如 Dict
我是一名优秀的程序员,十分优秀!