AppDomains 間で .NET オブジェクトを効率的に共有または移動する方法はありますか? AppDomains の目的は分離を提供することであることは理解していますが、計算と作成にコストがかかる比較的大きなキャッシュされた不変オブジェクトのセットを移動する必要がある場合があります。現時点では、機能するシリアル化アプローチがありますが、かなり遅いです。
5 に答える
オブジェクトをシリアル化せずに、AppDomain 間でオブジェクトを移動することはできません。これが AppDomain の要点です。完全に独立したプロセスと考えることができます。
ここで、MarshallByRefObject の出番です。これにより、AppDomain の境界を越えてオブジェクトをシリアル化することなく、Remoting を介して他の AppDomain からオブジェクトを使用できます。まだリモート処理を使用しているため、オブジェクトを同じ AppDomain に保持するよりも遅くなりますが、オブジェクトが大きく、使用頻度が低い場合は、シリアル化してシリアル化を解除する場合と比較して、時間を大幅に節約できます。 2 番目の AppDomain に新しいコピーを作成します。
試すことができる 1 つのことは、オブジェクトを から派生させることですMarshalByRefObject
。既定では、オブジェクトは AppDomain 間で値によってマーシャリングされます。から派生したオブジェクトMarshalByRefObject
の場合、呼び出し元にはオブジェクトへのプロキシが与えられます。すべての呼び出しはプロキシを通過し、オブジェクトのアプリ ドメインにマーシャリングされます。これにより、両方のアプリ ドメインですべてのオブジェクトのコピーを作成する必要性を減らすことができます。
共有オブジェクトを管理するための別のアプリケーション スペースを作成し、Web サービスまたはリモート処理を使用して共有データを取得/設定するのはどうですか? 基本的に、(データの保存方法に応じて) 中央のインメモリ リポジトリを作成します。
.NET Remoting は、経験がかなり限られていますが、私が知っている最良の方法です。これを使用したい場合は、Ingo Rammer と Mario Szpuszta によるAdvanced .NET Remoting, Second Editionを読む必要があります。.NET Remoting をグーグルで検索し始めると、Ingo の名前が頻繁に表示されます。この本は今では少し古くなっていることがわかりましたが、非常に価値があります。大きなバイナリ シリアル化オブジェクトではまだ試していませんが、これまで扱ってきた小さなオブジェクトでは効率的だと思われます。カスタムのシリアライゼーション/デシリアライゼーションを実装しない限り、SecureString プロパティを持つオブジェクトを持つことはできないことがわかりました。
私は少数の「祝福された」オブジェクトだけが「ブリードによるマーシャリング」ができると信じています。
全体をコピーしようとするのではなく、分厚い場合は呼び出しのリモート化が機能するはずです(他に何もないとしても、メモリの大きな無駄です)