Я создаю сборку с использованием Reflection.Emit и хочу, чтобы она вызывала специальный обратный вызов.Вызов лямбды из сборщика, генерирующего отражение
Вот упрощенная версия кода:
public void Call(ILGenerator il, Delegate action)
{
il.Emit(OpCodes.Call, action.Method);
}
public static void DoStuff()
{
Console.WriteLine("Action invoked!");
}
Call(CurrentMethod.ILGenerator, DoStuff);
Этот код работает так же, как и ожидалось.
Однако, я хочу передать лямбда-выражения, например:
Call(CurrentMethod.ILGenerator,() => Console.WriteLine("test"));
На этот раз следующее исключение:
System.MethodAccessException: Покушение методом».run() 'для доступа к методу' Compiler.Test.ImportedFunctions.b__0() 'не удалось.
Есть ли способ обойти его?
Действительно ли код работает под полным доверием? – Greg
@Greg, сборка создается с помощью 'AppDomain.CurrentDomain.DefineDynamicAssembly (name, AssemblyBuilderAccess.RunAndSave)'. Как проверить настройки доверия? – Impworks
@Impworks: Если вы можете это сделать, вы уже работаете под полным доверием :) – leppie