AppDomain 間で不変オブジェクトを参照によってマーシャリングするように CLR に指示できますか?

StackOverflow https://stackoverflow.com/questions/824912

質問

.NET の AppDomain 間でオブジェクトをマーシャリングする場合、CLR はオブジェクトをシリアル化します (オブジェクトに Serializable 属性)またはプロキシを生成します(属性を継承する場合) MarshalByRef)

ただし、文字列の場合、CLR は文字列オブジェクトへの参照を新しい AppDomain に渡すだけです。.NET 文字列は不変であり、2 番目の AppDomain による文字列への変更は元のオブジェクトに影響を与えないため、CLR は引き続き整合性を保証します。

そこで私の質問が生まれます。カスタム型が不変であり、リモート処理で使用する場合は文字列クラスの場合と同様にオブジェクトへの参照を渡すだけであることを CLR に伝える方法はありますか?

役に立ちましたか?

解決

マーシャリングというのは実は かなりトリッキーな.

あなたが説明している動作は「マーシャルバイブリード」と呼ばれ、ランタイムはそれを使用して文字列をマーシャリングし(場合によっては)、System.Threading.Thread を常にマーシャリングします。

私の知る限り、これを制御することはできません (カスタムマーシャリング動作を定義できると記事に記載されていますが、それに関するドキュメントが見つかりません)。IntPtr を渡し、安全でないコードを使用してこれをシミュレートする可能性があります。 、しかし、私にとってそれは巨大なハッキングのような匂いがします。

他のヒント

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

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

おっしゃるように、System.StringはSerializableAttributeで装飾されているため、文字列は値によってマーシャリングされます。

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

これがお役に立てば幸いです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top