2009-05-05 1 views
12

.NETでアプリケーションドメイン間でオブジェクトをマーシャリングするとき(それはSerializable属性を持っている場合)、CLRは、オブジェクトをシリアル化するか、または(それがMarshalByRefを継承している場合)、それはプロキシを生成するCLRに、参照によってAppDomains間の不変オブジェクトをマーシャリングするように指示できますか?文字列で

CLRがちょうど通過するが新しいAppDomainへの文字列オブジェクトへの参照。 .NET文字列は不変であり、2番目のAppDomainによる文字列への変更が元のオブジェクトに影響を与えないため、CLRは依然として整合性を保証します。

これは私の質問につながります:私のカスタムタイプが不変であることをCLRに伝える方法はありますか?リモーティングで使用すると、文字列クラスと同じようにオブジェクトへの参照を渡すだけですか?

+0

これが関連しているかどうかはわかりませんが、境界を越える前に文字列を固定していますか? –

+0

ピンによって固定{}ブロックのような意味であれば、いいえ、ピニングはオブジェクト参照をアンマネージ領域に送るときにのみ使用されます。 – Yona

答えて

7

マーシャルは実際にはfairly trickyです。

あなたが記述している振る舞いは "マーシャルバイブリード"と呼ばれ、ランタイムはこれを使用して文字列を(時には)マーシャリングし、System.Threading.Threadを常にマーシャリングします。

私はこれを制御できない(カスタムマーシャリングの動作を定義することはできますが、ドキュメントは見つかりません)、あなたはおそらくIntPtrを渡して安全でないこれをシミュレートするコードですが、巨大なハックのようなにおいがします。

+1

大きな+1をリンクのために更新したいと思うかもしれません、Marshall by Bleedは面白いです – ShuggyCoUk

1

そうは思いません。私は、プリミティブと同様に、ランタイムによって直接処理されると信じています。

0

.NET Remotingには、値による整列化(SerializableAttribute)と参照による整列化(MarshalByRef)の2つのマーシャリングセマンティクスしかありません。

System.StringがSerializableAttributeで装飾されているので、わかるように、文字列は値によってマーシャリングされます。

アプリドメイン間でオブジェクトを渡したいだけでコピーを作成したい場合(リモートアプリドメイン内のオブジェクトの変更はローカルアプリドメインのオブジェクトに影響しません)、必要なのはSerializableAttributeあなたのクラスに。

これが役に立ちます。

+0

申し訳ありませんsambo99のリンクされたブログはあなたが間違っていることを示しています。 – ShuggyCoUk

関連する問題