1

我有一个烦人的情况,即使我完全信任地运行代码,方法的后期绑定调用也会引发 MethodAccessException。情况如下:

我有一个基类,它按照约定映射一些事件处理逻辑,这些处理程序使用通过发出 IL 代码创建的动态方法调用,遵循本教程: http: //www.codeproject.com/KB/cs/dynamicmethoddelegates.aspx

//in AssemblyA.dll:
public abstract class Base : IEventHandler
{
    protected static void RegisterDerivedType(Type derived)
    {
        //create list of delegates to invoke event handlers 
    }

    void IEventHandler.Handle(IEvent e)
    {
        //late bound invocation of appropriate handler method (e.g. EventX 
        //or EventY)
        //this code throws a MethodAccessException
    }
}

//in assemblyB.dll
public class Derived : Base
{
    static Derived()
    {
        RegisterDerivedType(typeof(Derived));
    }

    private void OnEventX(EventX e) //EventX is derived of IEvent
    { }

    private void OnEventY(EventY e) //EventY is derived of IEvent
    { }
}

为什么我不能用动态方法调用私有成员?

4

1 回答 1

3

DynamicMethod还是守规矩的!要使其弯曲它们,您必须(在创建时DynamicMethod)将owner参数指定为声明私有方法的类型;那么你就好像你在那个类型里面一样有效地运行。所以:

var method = new DynamicMethod(
      name, returnType, parameterTypes, declaringType, true);

(或任何接受 的类似重载owner

于 2011-12-12T12:23:34.943 回答