Tag: dynamicmethod

动态IL方法导致“操作可能破坏运行时的稳定性”

System.Security.VerificationException:操作可能会破坏运行时的稳定性。 在Connance.CommunicatorApi.ReportApiClient.AcknowledgeRecallsAsyncDynamicHandler(Object,AcknowledgeRecallsCompletedEventArgs) 那是我得到的错误。 我正在尝试做的(背景)是为一类方法创建一个全局事件处理程序。 我正在使用WCF中的静态代理,我需要创建一个跟踪所有调用并返回所有WCF Web方法的层。 不幸的是,WCF强烈地键入了“已完成”事件的EventArgs,几乎不可能。 我决定尝试一下。 如果事件是EventHandler ,我仍然可以注册签名void Method(object, object)来处理事件。 大。 所以我开始创建一个DynamicMethod ,它将调用我的全局处理程序,并将其注册到每个事件。 我试过两种方法: 1)DynamicMethod的类型为void(对象,对象) 2)类型为void(object,SomeSpecificEventArgs) – 我使用generics方法来获取类型。 只有当我尝试手动或为事件调用方法时,我才得到上述exception。 这是我的代码: // The handler for all callbacks. // in the example it does nothing. public void Handler(object sender, object e) { dynamic evtArgs = e; object userState = evtArgs.UserState; } private string GetIdentifier(Delegate d) […]

动态方法的实际例子?

我想学习动态方法及其使用c#的实际例子。 动态方法和reflection之间有什么关系吗? 请帮我。

DynamicMethod具有generics类型参数

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

DynamicMethod比编译的IL函数慢得多

我写了一个复制公共属性的简单对象复制器。 我无法弄清楚为什么Dynamic方法比c#版本慢得多。 持续时间 C#方法:4,963毫秒 动态方法:19,924毫秒 请注意 – 当我在启动秒表之前运行动态方法时 – 持续时间不包括编译阶段。 我在调试和发布模式下,在x86和x64模式下运行,从VS和命令行运行,结果大致相同(动态方法慢400%)。 const int NBRECORDS = 100 * 1000 * 1000; public class Person { private int mSomeNumber; public string FirstName { get; set; } public string LastName { get; set; } public DateTime DateOfBirth { get; set; } public int SomeNumber { get { return […]

如何从DynamicMethod获取IL bytearray?

作为一个新奇的东西,我试图看看IL与运行时生成的轻量级代码与VS编译器生成的代码有多么不同,因为我注意到VS代码往往以不同的性能配置文件运行管型。 所以我写了下面的代码:: Func vs = x=>(string)x; Expression<Func> exp = x=>(string)x; var compiled = exp.Compile(); Array.ForEach(vs.Method.GetMethodBody().GetILAsByteArray(),Console.WriteLine); Array.ForEach(compiled.Method.GetMethodBody().GetILAsByteArray(),Console.WriteLine); 不幸的是,这会引发exception,因为GetMethodBody显然是对表达式树生成的代码的非法操作。 我怎么能以库的方式(即不使用外部工具,除非工具有API)查看代码使用轻量级codegen生成的代码? 编辑:错误发生在第5行,编译.Method.GetMethodBody()抛出exception。 Edit2:有谁知道如何恢复方法中声明的局部变量? 或者没有办法GetVariables?

通过动态方法解析IL中发现的令牌

感谢Hans Passant在这里回答我的问题: 如何从DynamicMethod获取IL bytearray? 我能够起床和跑步。 我现在正在尝试解决在IL发出的元数据令牌,以查看正在调用哪些方法,或者什么不是。 我能够解决方法体中的下一个标记是一个调用。 我正在使用Mono.Reflection的MethodBodyReader中的一些代码。 static byte[] GetILByteArray(Delegate @delegate){ // does stuff mentioned in other thread } … Expression foo = () => Console.WriteLine(0); var compiled = foo.Compile(); var bytes = GetILByteArray(compiled); int index =Array.FindIndex(bytes,b=>GetOpCode(b).OperandType == OperandType.InlineMethod); var token = BitConverter.ToInt32(bytes,index+1); compiled.Method.Module.ResolveMember(token); 引发exception,说明该域中的令牌是不可解析的。 这里有人有诀窍吗? 我应该尝试传递代理通用参数还是完全没用? 我正在考虑为表达式树的代表编写反编译器的想法,我真的希望能够使用表达式树,我将自己编译为测试用例,因为我总是可以回到原始版本并进行比较。