1

理解できない小さな問題が発生しました。クライアント側で透過プロキシをラップしようとしているサーバー側のMarshalByRefObjectがあります。設定は次のとおりです。

public class ClientProgram {
    public static void Main( string[] args ) {
        ITest test = (ITest)Activator.GetObject( typeof( ITest ), "http://127.0.0.1:8765/Test.rem" );
        test = (ITest)new MyProxy( test ).GetTransparentProxy();
        test.Foo();
    }
}

public class MyProxy : RealProxy {

    private MarshalByRefObject _object;

    public MyProxy( ITest pInstance )
        : base( pInstance.GetType() ) {
        _object = (MarshalByRefObject)pInstance;
    }

    public override IMessage Invoke( IMessage msg ) {
        return RemotingServices.ExecuteMessage( _object, (IMethodCallMessage)msg );
    }
}

問題は、RemotingServices.ExecuteMethodを呼び出すと、「ExecuteMessageはオブジェクトのネイティブコンテキストからのみ呼び出すことができます」というメッセージとともに例外がスローされることです。これを正しく機能させる方法を誰かが指摘できますか?リモートオブジェクトのメソッド呼び出しの前後にコードを挿入する必要があります。乾杯!

4

2 に答える 2

1

とった。あなたのコメントは私を正しい軌道に乗せました。重要なのは、プロキシをアンラップし、その上で呼び出しを呼び出すことです。ありがとうございました!!!!!

public class ClientProgram {
        public static void Main( string[] args ) {
            ITest test = (ITest)Activator.GetObject( typeof( ITest ), "http://127.0.0.1:8765/Test.rem" );
            ITest test2 = (ITest)new MyProxy( test ).GetTransparentProxy();
            test2.Foo();
        }
    }

public class MyProxy : RealProxy {

    private object _obj;

    public MyProxy( object pObj )
        : base( typeof( ITest ) ) {
        _obj = pObj;
    }

    public override IMessage Invoke( IMessage msg ) {
        RealProxy rp = RemotingServices.GetRealProxy( _obj );
        return rp.Invoke( msg );
    }
}
于 2008-10-20T19:13:30.147 に答える
0

私は少し前にそれを行い、正確な手順を忘れましたが、RemotingServices.GetRealProxy を使用してテストオブジェクトからプロキシを取得し、これを MyProxy に渡し、invoke を呼び出してみてください。

このようなもの:

ITest test = (ITest)Activator.GetObject( typeof( ITest ), "http://127.0.0.1:8765/Test.rem" );
RealProxy p2 = RemotingServices.GetRealProxy(test)
test = (ITest)new MyProxy( p2 ).GetTransparentProxy();
test.Foo();

直接クラスの代わりに RealProxy で動作するように MyProxy クラスを更新する必要があります

于 2008-10-20T18:45:13.013 に答える