System.Security.VerificationException: операция может дестабилизировать среду выполнения.at Connance.CommunicatorApi.ReportApiClient.AcknowledgeRecallsAsyncDynamicHandler (Object, AcknowledgeRecallsCompletedEventArgs)
Это ошибка, которую я получаю.То, что я пытаюсь сделать (фон), это создать глобальный обработчик событий для класса методов.Я работаю со статическим прокси в WCF, и мне нужно создать слой, который отслеживает все вызовы и возвращает все веб-методы WCF.К сожалению, WCF строго набирает EventArgs «Завершенных» событий, что делает его практически невозможным.
Я решил что-то попробовать.Если событие EventHandler<SomeSpecificEventArgs>
, я все еще могу зарегистрировать метод подписи void Method(object, object)
для обработки события.Отлично.Поэтому я решил создать DynamicMethod
, который будет вызывать мой global обработчик, и зарегистрировать его для каждого события.
Я пробовал два способа:
1) DynamicMethod имеет тип void (объект, объект)
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);
}
edit: я вижу.Оказывается, у меня есть другая проблема.Я работаю в 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
общедоступные статические и аргументы загрузки 0-1?В итоге я получаю сообщение об ошибке:
Попытка с помощью метода 'DynamicClass.TestMethod2 (System.String, System.String)' для доступа к методу dynamicass.MyClass.Handler (System.String, System.String) 'не удалось. "}