Tag: reflection.emit

使用Delegate调用构造函数

我发现了这个,但试图使用它并失败了。 如何使用reflection创建对象并通过将其置于委托中来加快速度? DynamicMethod dm = new DynamicMethod(“MyCtor”, t, new Type[] { }); var ctor = t.GetConstructor(new Type[] { }); ILGenerator ilgen = dm.GetILGenerator(); ilgen.Emit(OpCodes.Ldarg_0); ilgen.Emit(OpCodes.Newobj, ctor); ilgen.Emit(OpCodes.Ret); var d = (Func)dm.CreateDelegate(t); dm.Invoke(null, new object[] { }); 在把它删除之前我试图至少调用它,当我在上面做的时候我得到了错误 An unhandled exception of type ‘System.Reflection.TargetInvocationException’ occurred in mscorlib.dll 附加信息:调用目标抛出了exception。 如果我调用d()而不是我得到exception An unhandled exception of type ‘System.ArgumentException’ occurred […]

创建DynamicMethod为属性赋值?

这是一项学习练习。 我创建了一个方法,它接受一个Foo和一个字符串并设置A属性。 我使用Reflector反汇编来生成以下发射代码。 反汇编看起来像这样: .method private hidebysig static void Spork(class ConsoleTesting.Foo f, string ‘value’) cil managed { .maxstack 8 L_0000: ldarg.0 L_0001: ldarg.1 L_0002: callvirt instance void ConsoleTesting.Foo::set_A(string) L_0007: ret } 好的,所以我在之后建模了我的发射代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; using System.Reflection.Emit; namespace ConsoleTesting { class Foo { public string A { get; […]

IL的generics?

是否可以在IL Generator中使用generics? DynamicMethod method = new DynamicMethod( “GetStuff”, typeof(int), new Type[] { typeof(object) }); ILGenerator il = method.GetILGenerator(); … etc

动态C#.NET Web服务

我在C#ASP.NET项目中使用一个类来允许用一些随机脚本语言编写的脚本动态地公开webservice方法 – 换句话说,脚本应该能够公开任何具有任何签名的任何名称的方法(只要因为它通过这个SOAP接口对外界是有效的(能够随意添加和删除它们,而不需要硬代码更改),因此我需要能够在C#中创建一个Web服务类,同时能够在运行时动态添加和删除方法。 现在,到目前为止我能够提出的最好的计划是(运行时)生成C#代码来表示web服务,使用System.Reflection.Emit编译它然后在运行时加载程序集 – 所有这些都是脚本添加的或从服务中删除方法(不应经常发生,请注意)。 有没有人有比这更好的主意?

如何在运行时向方法添加属性?

我们使用Microsoft.Practices.CompositeUI.EventBroker来处理我们的应用程序中的事件订阅和发布。 可行的方法是向事件添加属性,指定主题名称,如下所示: [EventPublication(“example”, PublicationScope.Global)] public event EventHandler Example; 然后你用你的处理程序添加另一个属性,使用相同的主题名称,如下所示: [EventSubscription(“example”, ThreadOption.Publisher)] public void OnExample(object sender, EventArgs e) { … } 然后将对象传递给EventInspector,它匹配所有内容。 我们需要对此进行调试,因此我们尝试创建一个订阅所有事件的调试类。 我可以获得所有主题名称的列表……但仅限于运行时。 因此,在将调试对象传递给EventInspector之前,我需要能够在运行时向方法添加属性。 如何在运行时向方法添加属性?

LambdaExpression CompileToMethod

我有几行代码 public void CreateMethod(Expression<Action> method) { var innerMethod = Builder.DefineMethod(“SomeName”,MethodAttributes.Private); method.CompileToMethod(innerMethod); //more code } 但是第二行失败了。 我尝试过不同版本的DefineMethod运气不佳。 有什么建议?

在动态事件处理程序中引用’this’

在我的’myClass’类中,我使用Reflection.Emit为myClass类的一个成员动态编写一个事件处理程序。 我成功完成了这个。 现在,我想修改事件处理程序以调用myClass类中的一个实例方法。 但是,我无法弄清楚如何使用Reflection.Emit将对’this’的引用推送到MSIL堆栈。 在事件处理程序中,Ldarg_0不是对“this”的引用,而是事件处理程序的第一个参数。 有没有人知道如何在堆栈上推送’this’的引用,以便我可以调用实例方法。 例如,这就是我希望c#代码看起来像: public class myClass { private myObj1 obj1; public myClass() { this.init(); } private void init() { obj1.myEvent += new myEvent_EventHandler(theHandler); } private void theHandler(myObj2 obj2, myObj3 obj3) { // this is the part I’m having trouble with this.myFunction(obj2); } private void myFunction(myObj2 obj2) { // irrelevant } } […]

将对象文字提供给ILGenerator

Food obj = …; ILGenerator gen = (…).GetILGenerator(); gen.Emit( ?? obj ?? ); // replace this gen.Emit(OpCodes.Call, typeof(Person).GetMethod(“Eat”)); 显然不可能干净地将obj推到评估堆栈上,但我对丑陋的黑客持开放态度,这可能会影响可移植性。 ModuleBuilder.DefineInitializedData允许在.sdata中存储System.Byte []。 有任何想法吗? 编辑:生成的方法作为新程序集的一部分发出。

使用Reflection.Emit覆盖属性定义

我正在尝试使用Reflection.Emit(TypeBuilder)实现此模式: public class ClassToBeProxied { public virtual object Property1 { get; set; } } public class Proxy : ClassToBeProxied { [AttributeToBeAdded] public override object Property1 { get { //do something else to return the object – ie get it from the database return null; //stub } set { //do something else to set the object […]

IL Emit用于调用委托实例?

基本上,我接受一个事件名称作为字符串,以获取EventInfo 。 然后,我使用reflection发现事件处理程序类型和事件参数类型,创建该类型的新委托( myEventHandler ),并将其与事件挂钩。 当调用myEventHandler ,我需要向下转换并将参数传递给处理程序。 我的代码如下。 当调用’d’时,需要通过myEventHandler调用’handler’。 我需要在那里放一些reflection发射代码??? 有什么想法吗? EventHandler handler = delegate(object sender, EventArgs eventArgs) { //something will happen here }; Type[] typeArgs = { typeof(object), derivedEventArgsType }; DynamicMethod myEventHandler = new DynamicMethod(“”, typeof(void), typeArgs); var ilgen = myEventHandler.GetILGenerator(); //What should be the IL code here to //cast derviedEventArgs to EventArgs and […]