Kann ich der CLR sagen, dass unveränderliche Objekte zwischen Appdomains durch Bezugnahme untersucht werden?

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

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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top