如何将DynamicMethod标记为SecurityCritical?

问题描述 投票:0回答:1

我正在使用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;
}
c# cil code-access-security dynamicmethod
1个回答
0
投票

不幸的是,如DynamicMethod类文档所述,运行时不支持向动态方法发送自定义属性:

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

© www.soinside.com 2019 - 2024. All rights reserved.