Tag: reflection.emit

为什么Calli比代表电话更快?

我正在玩Reflection.Emit,并且发现了关于使用不多的EmitCalli 。 好奇,我想知道它是否与常规方法调用有所不同,所以我掀起了下面的代码: using System; using System.Diagnostics; using System.Reflection.Emit; using System.Runtime.InteropServices; using System.Security; [SuppressUnmanagedCodeSecurity] static class Program { const long COUNT = 1 << 22; static readonly byte[] multiply = IntPtr.Size == sizeof(int) ? new byte[] { 0x8B, 0x44, 0x24, 0x04, 0x0F, 0xAF, 0x44, 0x24, 0x08, 0xC3 } : new byte[] { 0x0f, 0xaf, 0xca, […]

Reflection.Emit与CodeDOM

使用Reflection.Emit库与CodeDOM在运行时dynamic生成代码有什么优点/缺点? 我正试图在一个系统中生成一些(相对复杂的)dynamic类,这些类是基于运行时可用的XML格式的元数据。 我将生成扩展应用程序集合中的现有类,实现更多接口,添加方法以及覆盖虚拟和抽象成员的类。 在深入实施之前,我想确保select合适的技术。 有关这些不同的代码生成技术如何不同的任何信息将会有所帮助。 此外,任何关于简化或简化工作的开放源代码库的信息都会有用。

呼叫和Callvirt

CIL指令“Call”和“Callvirt”之间有什么区别?

好奇心:为什么expression式编译时运行速度比最小的DynamicMethod快?

我目前正在做一些最后的措施优化,主要是为了好玩和学习,并发现了一些让我留下几个问题的东西。 一,问题: 当我通过使用DynamicMethod在内存中构造一个方法,并使用debugging器时,在反汇编视图中查看代码时,有什么办法让我进入生成的汇编代码? debugging器似乎只是对我整个方法 或者,如果这是不可能的,是否有可能以某种方式将生成的IL代码作为程序集保存到磁盘,以便我可以使用Reflector对其进行检查? 为什么我的简单添加方法(Int32 + Int32 => Int32)的Expression<…>版本比最小的DynamicMethod版本运行得更快? 这是一个简短而完整的程序,演示。 在我的系统上,输出是: DynamicMethod: 887 ms Lambda: 1878 ms Method: 1969 ms Expression: 681 ms 我期望lambda和方法调用具有更高的值,但DynamicMethod版本的速度始终低于30-50%(可能由于Windows和其他程序而异)。 任何人都知道原因? 这是该计划: using System; using System.Linq.Expressions; using System.Reflection.Emit; using System.Diagnostics; namespace Sandbox { public class Program { public static void Main(String[] args) { DynamicMethod method = new DynamicMethod("TestMethod", typeof(Int32), new […]

快速创build对象而不是Activator.CreateInstance(type)

我试图改善我们的应用程序的性能。 我们有很多Activator.CreateInstance调用导致一些悲伤。 我们基于一个接口(ITabDocument)来实例化很多类,然后环顾四周,我想到了使用这个代码: 代码不会比使用我们拥有的Activator.CreateInstance代码更好。 public static Func<T> CreateInstance<T>(Type objType) where T : class, new() { var dynMethod = new DynamicMethod("DM$OBJ_FACTORY_" + objType.Name, objType, null, objType); ILGenerator ilGen = dynMethod.GetILGenerator(); ilGen.Emit(OpCodes.Newobj, objType.GetConstructor(Type.EmptyTypes)); ilGen.Emit(OpCodes.Ret); return (Func<T>)dynMethod.CreateDelegate(typeof(Func<T>)); } 我想知道为什么这是我所做的是: ITabDocument document = CreateInstance<ITabDocument>(Type.GetType("[Company].Something")); 有没有更好的方法来创build可以协助上述的对象? 当你不确定具体types时有点难。

如何在C#中dynamic创build一个类?

我有一个看起来像这样的课程: public class Field { public string FieldName; public string FieldType; } 而一个对象List<Field>的值为: {"EmployeeID","int"}, {"EmployeeName","String"}, {"Designation","String"} 我想创build一个如下所示的类: Class DynamicClass { int EmployeeID, String EmployeeName, String Designation } 有没有办法做到这一点? 我希望这是在运行时生成的。 我不想要一个物理的CS文件驻留在我的文件系统中。