При закрытом вызове закрытого члена генерируется исключение MethodAccessException - PullRequest
1 голос
/ 12 декабря 2011

У меня досадная ситуация, когда вызов метода с поздней привязкой вызывает исключение 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
    { }
}

Почему я не могу вызывать приватных членов динамическим методом?

1 Ответ

3 голосов
/ 12 декабря 2011

DynamicMethod все еще следует правилам!Чтобы заставить их сгибаться, вы должны (при создании DynamicMethod) указать параметр owner в качестве типа , который объявляет закрытый метод ;тогда вы эффективно работаете так, как будто вы внутри этого типаИтак:

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

(или любая из аналогичных перегрузок, которые принимают owner)

...