System.Security.VerificationException:操作可能会破坏运行时的稳定性。在 Connance.CommunicatorApi.ReportApiClient.AcknowledgeRecallsAsyncDynamicHandler(对象,AcknowledgeRecallsCompletedEventArgs)
这就是我得到的错误。我正在尝试做的(背景)是为一类方法创建一个全局事件处理程序。我正在使用 WCF 中的静态代理,我需要创建一个层来跟踪所有调用并返回到所有 WCF Web 方法。不幸的是,WCF 强烈键入“已完成”事件的 EventArgs,这几乎是不可能的。
我决定尝试一下。如果事件是EventHandler<SomeSpecificEventArgs>
,我仍然可以注册一个签名方法void Method(object, object)
来处理该事件。伟大的。所以我开始创建一个DynamicMethod
调用我的全局处理程序的函数,并将它注册到每个事件中。
我尝试了两种方法:
1) DynamicMethod 是 void (object, object) 类型
2) void (object, SomeSpecificEventArgs) 类型——我为此使用通用方法来获取类型。
只有当我尝试手动或为事件调用该方法时,才会出现上述异常。
这是我的代码:
// 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)
{
return string.Concat(d.Method.DeclaringType, '.', d.Method.Name);
}
// Method to register an event handler
public void Register<T> (Delegate o) where T : EventArgs
{
// get some info
/* snip. code to get method name, and calculate name of event */
var eventInst = ownerType.GetEvent(eventName);
// The following works, for example:
// someObj.MethodCompleted += Handler;
// even though MethodCompleted is an event of type EventHandler<SomeSpecialEventArgs>
// get the actual type of handler
var handlerType = eventInst.EventHandlerType;
EventHandler evtHandler = new EventHandler(Handler);
DynamicMethod dm = new DynamicMethod(
GetIdentifier(o) + "DynamicHandler", // set the name
typeof(void), // return void
new[] { typeof(object), typeof(T) });// params object and type of event args
ILGenerator gen = dm.GetILGenerator();
gen.Emit(OpCodes.Ldarg_0); // load first arg to stack for calling
gen.Emit(OpCodes.Ldarg_2); // load second arg to stack for calling
gen.Emit(OpCodes.Call, evtHandler.Method); // call method
gen.Emit(OpCodes.Ret); // return
// this is the final delegate
var superdlg = dm.CreateDelegate(handlerType);
// the problem beings here:
// when the event is raised and the delegate is invoked
// of if I dynamicInvoke it, I get the error
eventInst.AddEventHandler(ownerInst, superdlg);
}
编辑:我明白了。原来我还有另一个问题。我在 Silverlight 工作。我设法在一个单独的项目中重现了我的场景,并通过使用DynamicMethod
允许您设置所有者的重载来使其工作。然后我指定
DynamicMethod dm = new DynamicMethod("TestMethod2", typeof(void), new[] { typeof(MyClass), typeof(string), typeof(string) }, typeof(MyClass));
,
并使用ldarg.0
,ldarg.1
和ldarg.2
. 但这是一个安全关键的构造函数,不会在 silverlight 上运行。我只是不确定我需要如何设置它。我是否将Handler
公共设为静态并加载 args 0-1?我最终得到这样的错误:
通过方法 'DynamicClass.TestMethod2(System.String, System.String)' 尝试访问方法 'dynamicass.MyClass.Handler(System.String, System.String)' 失败。"}