如何将 DynamicMethod 标记为 SecurityCritical?

m93a

我正在使用此 TaskFromEvent 方法的稍微修改版本它基本上创建了一个在事件触发时完成的任务。这是通过使用DynamicMethod和发出 IL 代码实现的。当我在虚拟环境中做一些简单的测试时,一切正常。但是后来我需要在更复杂的环境中使用它¹并且它与Attempt of transparent method DynamicClass.unnamed to access a critical type RenamedEventArgs was denied. 我只是模糊地理解 IL 和 CAS 的概念,但从我读过的内容来看[SecuritySafeCriticalAttribute]我认为这可以通过应用DynamicMethod. 如何将此属性应用于动态方法?


¹:具体来说,我需要等待由 CefSharp 中的 JavaScript 触发的事件创建的任务

.

这是我认为最相关的代码摘录(此处为完整代码):

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类文档所述,运行时不支持向动态方法发出自定义属性

动态方法或其参数不支持自定义属性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章