2009-06-11 6 views
1

AppDomains全体で.NETオブジェクトを効率的に共有または移動する方法はありますか?私はAppDomainsの目的は分離を提供することであることを認識していますが、計算と作成に高価な比較的大きなキャッシュされた不変オブジェクトのセットを移動する必要がある場合があります。現時点では、私は動作するシリアライゼーションアプローチを持っていますが、かなり遅いです。.NET内のAppDomains間でオブジェクトを移動する

答えて

4

AppDomainをシ​​リアル化せずにオブジェクトを移動することはできません。これがAppDomainの要点です。あなたはそれを完全に別個のプロセスと考えることができます。

ここで、MarshallByRefObjectが機能します。 他のAppDomainのオブジェクトをRemoting経由で使用することができます.AppDomain境界を超えてシリアル化する必要はありません。あなたはまだリモートで作業しているので、同じAppDomainにオブジェクトを保持するよりも時間がかかりますが、オブジェクトが大きく、頻繁に使用していない場合は、シリアル化およびシリアル化解除に比べて膨大な時間を節約できます2番目のAppDomainで新しいコピーを作成します。

2

試してみることの1つは、オブジェクトをMarshalByRefObjectから派生させることです。既定では、オブジェクトはAppDomains全体の値によってマーシャリングされます。 MarshalByRefObjectから派生したオブジェクトの場合、呼び出し元にオブジェクトへのプロキシが与えられます。すべての呼び出しはプロキシを通過し、オブジェクトのアプリケーションドメインにマーシャリングされます。これにより、両方のアプリドメインにすべてのオブジェクトのコピーを作成する必要性を減らすことができます。

0

私はほんの数「恵まれた」オブジェクトはすなわちちょうど彼らが分厚いある場合に動作するはずの呼び出しをリモート処理

(文字列は1である)のではなくしようとして境界を越えてドリフトを聞かせて「ブリードによって元帥」にできることを信じています

1

共有オブジェクトを管理するために別のアプリケーションスペースを作成し、Webサービスまたはリモートを使用して共有データを取得/設定する方法はありますか?あなたは、必然的に、(データの保存方法に応じて)リポジトリの中央にメモリを作成します。

0

.NETリモート処理が私が知っている最良の方法ですが、かなり限られた経験があります。これを使用したい場合は、アドバンスト.NET Remoting、Second Edition、Ingo Rammerおよび Mario Szpusztaを読む必要があります。あなたがグーグル・グーグルを起動すると、Ingoの名前が頻繁にポップアップします。私はこの本が少し年月日になったが、かなり貴重であることを発見した。私は大きなバイナリの直列化されたオブジェクトでそれを試していませんが、私が作業している小さなオブジェクトでは効率的です。カスタムのシリアル化/非直列化を実装しない限り、SecureStringプロパティを持つオブジェクトを持つことができませんでした。

関連する問題