如何将 DynamicMethod 标记为 SecurityCritical?
How to mark DynamicMethod as SecurityCritical?
我使用的是 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 class 文档所述:
Custom attributes are not supported on dynamic methods or their parameters.
我使用的是 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 class 文档所述:
Custom attributes are not supported on dynamic methods or their parameters.