3

プラグインに大きく依存する .net アプリケーションを開発しています。アプリケーション自体には、リモート サーバーへの接続が含まれています。

最近、私はアプリケーション ドメインを掘り下げて、アプリケーションの残りの部分からプラグイン コードを分離するための理想的なソリューションであると考えました。

ただし、プラグインをホストするアプリケーション ドメインを実装できない大きな欠点が 1 つあります。接続オブジェクトへの参照を渡すために必要な別のアプリケーション ドメインへの参照によってオブジェクトを渡す方法はないようです。

そのオブジェクトへの参照を渡すことができるように、誰かが回避策を教えてくれることを望んでいました。

注: プロキシの作成は問題外です。クラスは自動生成されるため、接続レイヤーは既にプロキシとして機能します。

注 2: System.AddIn は、コンパクト フレームワークでは使用できないため、使用できません。

4

3 に答える 3

5

MarshalByRefObjectから派生しようとしましたか? 継承階層を台無しにするのは面倒ですが、それはあなたが望んでいることだと思います。

ドキュメントから:

MarshalByRefObject は、プロキシを使用してメッセージを交換することにより、アプリケーション ドメインの境界を越えて通信するオブジェクトの基本クラスです。MarshalByRefObject から継承しないオブジェクトは、値によって暗黙的にマーシャリングされます。リモート アプリケーションが値によるマーシャル オブジェクトを参照すると、オブジェクトのコピーがアプリケーション ドメインの境界を越えて渡されます。

MarshalByRefObject オブジェクトは、ローカル アプリケーション ドメインの境界内で直接アクセスされます。リモート アプリケーション ドメイン内のアプリケーションが初めて MarshalByRefObject にアクセスすると、リモート アプリケーションにプロキシが渡されます。プロキシでの後続の呼び出しは、ローカル アプリケーション ドメインに存在するオブジェクトにマーシャリングされます。

型がアプリケーション ドメインの境界を越えて使用される場合、型は MarshalByRefObject から継承する必要があります。また、オブジェクトのメンバーは、それらが作成されたアプリケーション ドメインの外部では使用できないため、オブジェクトの状態をコピーしてはなりません。

私の経験では、かなり制限される可能性があります。実際には、AppDomain の境界を越えて行う必要があることをできるだけ少なくし、プリミティブ型、文字列、および両方の配列のみを必要とする操作に制限することをお勧めします。これは、複数の AppDomains を扱う経験がなかった私自身のせいかもしれませんが、これは地雷原のようなものであるという警告に過ぎません。

于 2008-11-27T08:30:55.950 に答える
1

AppDomain 間で同じインスタンスと対話するには、MarshalByRefObjectから継承する必要があります。このようにすると、オブジェクトへのすべてのメソッド呼び出し (プロパティなどを含む) は、実際には他のアプリ ドメインへのリモート呼び出しになります。それは役に立ちますか?

于 2008-11-27T08:31:14.047 に答える
1

MarshalByRefObjectプロキシのクリーンアップは、リースに基づいてクリーンアップされることに注意してください。つまり、特定の時間オブジェクトを使用しない場合、オブジェクトは再利用されます。これは、必要に応じてリース オブジェクトを返すようにオーバーライドすることで制御できInitializeLifetimeServiceます。戻ったnull場合、リースを効果的に無効にすると、オブジェクトは AppDomain がアンロードされたときにのみ回収されます。

于 2008-11-27T08:43:13.990 に答える