我正在使用this TaskFromEvent method的稍加修改的版本。它基本上会创建一个在事件触发时完成的任务。通过使用DynamicMethod
并发出IL代码,可以做到这一点。当我在虚拟环境中进行一些简单测试时,一切正常。但是,然后我需要在更复杂的环境中使用它¹,然后它崩溃并显示为Attempt of transparent method DynamicClass.unnamed to access a critical type RenamedEventArgs was denied
。我只是模糊地理解了IL和CAS的概念,但是根据我的阅读,我认为可以通过将[SecuritySafeCriticalAttribute]
应用于DynamicMethod
来解决此问题,但是我该怎么做?如何将此属性应用于动态方法?
¹:特别是我需要等待一个由CefSharp内部的JavaScript触发的事件创建的任务
。
这是我的代码中最相关的摘录(whole code here):
public static async Task<object> Once<T>(this T obj, string eventName)
{
var tcs = new TaskCompletionSource<object[]>();
// ... some code omitted ...
handler = new DynamicMethod("unnamed",
returnType, parameterTypesArray, tcsType);
ILGenerator ilgen = handler.GetILGenerator();
// ... generating the IL ...
ilgen.Emit(OpCodes.Ret);
Delegate deleg = handler.CreateDelegate(delegateType, tcs);
eventInfo.AddEventHandler(target, deleg);
var args = await tcs.Task;
eventInfo.RemoveEventHandler(target, deleg);
return args;
}
不幸的是,如DynamicMethod类文档所述,运行时不支持向动态方法发送自定义属性:
动态方法或其参数不支持自定义属性。