Kann ich der CLR sagen, dass unveränderliche Objekte zwischen Appdomains durch Bezugnahme untersucht werden?
Frage
Wenn Objekte zwischen Appdomains in .NET marschieren, wird das CLR entweder das Objekt serialisieren (falls es das hat Serializable
Attribut) oder es generiert einen Proxy (wenn es von erbt MarshalByRef
)
Mit Saiten gibt die CLR jedoch nur den Verweis auf das String -Objekt in die neue AppDomain. Die CLR sorgt weiterhin für die Integrität, da .NET -Zeichenfolgen unveränderlich sind und jede Änderung durch die zweite Appdomain in die Zeichenfolge das ursprüngliche Objekt nicht beeinflusst.
Was mich zu meiner Frage bringt: Gibt es eine Möglichkeit, der CLR zu sagen, dass mein benutzerdefinierter Typ unveränderlich ist und wenn sie zur Entfernung verwendet wird, sollte sie einfach den Verweis auf das Objekt übergeben, wie es mit der String -Klasse der Fall ist?
Lösung
Marshalling ist eigentlich ziemlich schwierig.
Das Verhalten, das Sie beschreiben, heißt "Marschall-by-Bleed", die Laufzeit verwendet es, um Strings (manchmal) und Marschallsysteme zu marschallieren.
Soweit ich Ihnen sagen kann, haben Sie keine Kontrolle darüber (es ist in dem Artikel erwähnt, dass Sie benutzerdefiniertes Marshallohalling -Verhalten definieren können. Ich kann jedoch keine Dokumentation finden). Sie können möglicherweise ein INTPTR übergeben und unsicheren Code verwenden, um dies zu simulieren , aber es riecht nach einem riesigen Hack für mich.
Andere Tipps
Ich glaube nicht, nein. Ich glaube, dass dies wie die Primitiven direkt von der Laufzeit behandelt wird.
Sie haben nur zwei Marshaling -Semantik in .NET Remoting: Marschall nach Wert (serializableAttribute) und Marschall durch Bezugnahme (Marshalbyref).
Wie Sie angedeutet haben, werden Saiten nach Wert als System untersagt. STRING ist mit der SerializableAttribute dekoriert.
Wenn Sie Ihr Objekt zwischen den App -Domänen übergeben möchten und nur eine Kopie (keine Änderungen des Objekts in der Remote -App -Domäne beeinflussen, wirken sich das Objekt in der lokalen App -Domäne aus) dann können Sie die SerializableAttribute in Ihrer Klasse verwenden.
Hoffe das hilft.