回避策.netアプリケーションドメインは値によってのみオブジェクトを渡す
-
11-07-2019 - |
質問
プラグインに大きく依存する.netアプリケーションを開発しています。アプリケーション自体には、リモートサーバーへの接続が含まれています。
最近、アプリケーションドメインを掘り下げて、プラグインコードをアプリケーションの他の部分から分離するための理想的なソリューションであると考えています。
ただし、プラグインをホストするためのアプリケーションドメインを実装できないという大きな欠点が1つあります。接続オブジェクトへの参照を渡すために必要な別のアプリケーションドメインへの参照によってオブジェクトを渡す方法はないようです。
そのオブジェクトへの参照を渡すことができるように、誰かが回避策を提供できることを望んでいました。
注:プロキシの作成は問題外です。クラスが自動生成されるため、接続層はすでにプロキシとして機能します。
注2:System.AddInは、コンパクトフレームワークでは使用できないため使用できません。
解決
MarshalByRefObject から派生しようとしましたか?継承階層を台無しにするのは苦痛ですが、それはあなたが望むものだと思います。
ドキュメントから:
MarshalByRefObjectは基本クラスです 相互に通信するオブジェクトの場合 アプリケーションドメインの境界 プロキシを使用してメッセージを交換します。 継承しないオブジェクト MarshalByRefObjectは暗黙的に 値によるマーシャリング。リモコンが アプリケーションがマーシャルを参照する 値オブジェクト、オブジェクトのコピーは アプリケーションドメイン全体に渡される 境界。
MarshalByRefObjectオブジェクトは 内で直接アクセス ローカルアプリケーションの境界 ドメイン。初めてのアプリケーション リモートアプリケーションドメイン内 プロキシであるMarshalByRefObjectにアクセスします リモートアプリケーションに渡されます。 プロキシでの後続の呼び出しは 存在するオブジェクトにマーシャリングして戻る ローカルアプリケーションドメイン内。
型はから継承する必要があります タイプが次の場合のMarshalByRefObject アプリケーションドメイン全体で使用 境界、および状態 オブジェクトをコピーしてはいけません オブジェクトのメンバーは使用できません アプリケーションドメイン外 作成されました。
私の経験では、かなり制限される可能性があります-本当に、AppDomainの境界を越えてできる限り少ないことをする必要があり、できればプリミティブ型、文字列、および両方の配列のみを必要とする操作に自分自身を制限してください。これは、複数のAppDomainを操作した経験がないためかもしれませんが、これはほんの地雷原であるという警告にすぎません。
他のヒント
AppDomain間で同じインスタンスと通信するには、から継承する必要がありますMarshalByRefObject 。この方法で行うと、オブジェクト(プロパティなどを含む)へのすべてのメソッド呼び出しは、実際には他のアプリドメインへのリモート呼び出しです。それは役立ちますか?
MarshalByRefObject
プロキシのクリーンアップは、リースに基づいてクリーンアップされることに注意してください。要するに、特定の時間オブジェクトを使用しない場合、それは回収されます。これを制御するには、 InitializeLifetimeService
をオーバーライドして、必要に一致するリースオブジェクトを返します。 null
を返すと、リースが事実上無効になり、AppDomainがアンロードされたときにのみオブジェクトが回収されます。