如何将DynamicMethod标记为SecurityCritical?

时间:2017-08-25 22:04:44

标签: c# cil code-access-security dynamicmethod

我正在使用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;
}

1 个答案:

答案 0 :(得分:0)

不幸的是,如Template Sensor类文档所述

所述,运行时不支持向动态方法发射自定义属性:

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