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 に答える