Tag: reflection.emit

动态创建基类的类型和调用构造函数

我需要动态创建一个类。 大多数工作正常,但我坚持生成构造函数。 AssemblyBuilder _assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(“MyBuilder”), AssemblyBuilderAccess.Run); ModuleBuilder _moduleBuilder = _assemblyBuilder.DefineDynamicModule(“MyModule”); public static object GetInstance(this TSource source, string eventName) where TSource : class { var typeName = “MyTypeName”; var typeBuilder = _moduleBuilder.DefineType(typeName, TypeAttributes.Class | TypeAttributes.Public); // create type like class MyClass : GenericType var baseNotGenericType = typeof(GenericType); var baseType = baseNotGenericType.MakeGenericType(typeBuilder, typeof(TSource), typeof(TEventArgs)); typeBuilder.SetParent(baseType); […]

DynamicMethod具有generics类型参数

是否可以使用generics类型参数定义DynamicMethod? MethodBuilder类具有DefineGenericParameters方法。 DynamicMethod有对应的吗? 例如,是否可以使用DynamicMethod创建具有签名的方法? void T Foo(T a1, int a2)

Reflect.Emit Dynamic Type Memory Blowup

使用C#3.5我试图在运行时使用reflection发射生成动态类型。 我使用Microsoft的Dynamic Query Library示例创建了一个类生成器。 一切正常,我的问题是100个生成的类型使内存使用量膨胀大约25MB。 这是一个完全不可接受的内存配置文件,因为最终我想支持在内存中生成数十万种类型。 内存分析显示内存显然是由各种System.Reflection.Emit类型和方法持有,虽然我无法弄清楚原因。 我没有找到其他人谈论这个问题所以我希望这个社区中的某个人知道我做错了什么或者这是否是预期的行为。 下面的受控示例: using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.Reflection.Emit; namespace SmallRelfectExample { class Program { static void Main(string[] args) { int typeCount = 100; int propCount = 100; Random rand = new Random(); Type dynType = null; SlimClassFactory scf = new SlimClassFactory(); for (int i […]

动态创建方法并执行它

背景: 我想在C#中定义一些static方法,并从运行时(在客户端上)选择的这些方法之一生成IL代码作为字节数组,并通过网络将字节数组发送到应该执行它的另一台机器(服务器)从字节数组重新生成IL代码之后。 我的尝试: ( POC ) public static class Experiment { public static int Multiply(int a, int b) { Console.WriteLine(“Arguments ({0}, {1})”, a, b); return a * b; } } 然后我得到方法体的IL代码,如: BindingFlags flags = BindingFlags.Public | BindingFlags.Static; MethodInfo meth = typeof(Experiment).GetMethod(“Multiply”, flags); byte[] il = meth.GetMethodBody().GetILAsByteArray(); 到目前为止,我没有动态创建任何东西。 但我把IL代码作为字节数组,我想创建一个程序集,然后是一个模块,然后是一个类型,然后是一个方法 – 所有这些都是动态的。 在创建动态创建方法的方法体时,我使用上面代码中使用reflection得到的IL代码。 代码生成代码如下: AppDomain domain = […]

在C#中为运行时的接口创建一个类

我正在考虑使用一组对象,假设此时有3个对象存活,它们都实现了一个公共接口,然后将这些对象包装在第四个对象中,同时实现相同的接口。 第四个对象的方法和属性的实现将简单地调用这3个底层对象上的相关位。 我知道这里会出现这样的情况,这样做是没有意义的,但这是针对服务多播体系结构的,因此已经有了一套很好的限制。 我的问题是从哪里开始。 第四个对象的生成应该在内存中,在运行时完成,所以我在想Reflection.Emit ,遗憾的是我没有足够的经验来知道从哪里开始。 我是否必须构建内存中的程序集? 它看起来确实如此,但我只想快速指向我应该从哪里开始。 基本上我正在寻找一个接口,以及一个实现该接口的对象实例列表,并构建一个新对象,同时实现该接口,该接口应该“多播”所有方法调用和对所有底层对象的属性访问,at尽可能少。 exception会有很多问题,但是当我到达它们时我会解决这些问题。 这适用于面向服务的体系结构,我希望现有的代码(例如,记录器服务)现在可以访问多个记录器服务,而无需更改使用服务的代码。 相反,我想运行时生成一个logger-service-wrapper,它在内部简单地调用多个底层对象上的相关方法。 这适用于.NET 3.5和C#。

在为属性创建委托时无法绑定到目标方法

尝试创建两个发出的委托字典,以便在动态获取/设置属性值时提高性能。 码: Properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance) .Where(p => p.CanRead && !p.GetIndexParameters().Any()) .AsEnumerable(); PropertyGetters = Properties.ToDictionary(p => p.Name, p => (Func)Delegate.CreateDelegate(typeof(Func), p.GetGetMethod())); PropertySetters = Properties.Where(p => p.GetSetMethod() != null) .ToDictionary(p => p.Name, p => (Action)Delegate.CreateDelegate(typeof(Action), p.GetSetMethod())); 但是我得到以下exception: 无法绑定到目标方法,因为其签名或安全透明性与委托类型的签名或安全透明性不兼容。 从我所看到的,这将由静态/索引/值类型属性引起, Properties集合不包含静态或索引属性,但我确实需要它来处理值类型属性,如int和double 。 如何在保持代码抽象和避免generics的同时创建我需要的getter / setter?

Java等效的Reflection.Emit

据我所知,Java没有相应的C#的Reflection.Emit东西。 是否有任何其他Java库提供类似的function? 有什么区别( reflection发射 )?

使用Reflection.Emit创建实现接口的类

我需要使用Reflection.Emit生成一个实现以下接口的类。 public interface IObject { T Get(string propertyName); } 有没有人有一个例子,我将如何发出以下作为一个简单的测试用例? class GeneratedObject : IObject { public T Get(string propertyName) { // this is the simplest possible implementation return default(T); } }

Reflection.Emit比GetValue和SetValue更好:S

我被告知使用Reflection.Emit而不是PropertyInfo.GetValue / SetValue,因为这种方式更快。 但我真的不知道Reflection.Emit中有什么东西以及如何用它代替GetValue和SetValue。 任何人都可以帮我吗?

字段与属性的实际性能

我正在做一些后期构建的CIL编织,它将CIL添加到程序集中的所有方法(换句话说,大量的方法)。 每个方法检查特定值是否为空。 示例(C#Reflector’d版本的CIL代码): // CIL woven region start if (MyType.Something == null) { // … some new stuff } // CIL woven region end 将MyType.Something作为属性与字段的性能影响是什么? 我知道我已经读过C#编译器执行特殊优化,在这种情况下应该没有性能影响…但是在直接CIL代码(没有C#编译器)的情况下……? 或者它是允许这些优化的JIT编译器(因此直接CIL代码仍然有益)? 为静态属性的访问器发出OpCode.Call的性能是否比Ldsfld差(请注意,由于程序集中的每个方法都是编织的,所以这是成千上万次的调用)? 谢谢。