Posso dire al CLR di eseguire il marshalling di oggetti immutabili tra AppDomains per riferimento?

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

Domanda

Quando si esegue il marshalling di oggetti tra AppDomains in .NET, il CLR serializzerà l'oggetto (se ha l'attributo Serializable ) o genererà un proxy (se eredita da MarshalByRef )

Con le stringhe, tuttavia, il CLR passerà il riferimento all'oggetto stringa nel nuovo AppDomain. Il CLR garantisce comunque l'integrità poiché le stringhe .NET sono immutabili e qualsiasi modifica apportata dalla seconda AppDomain alla stringa non avrà effetto sull'oggetto originale.

Il che mi porta alla mia domanda: c'è un modo per dire al CLR che il mio tipo personalizzato è immutabile e quando usato in remoto dovrebbe semplicemente passare il riferimento all'oggetto come fa con la classe stringa?

È stato utile?

Soluzione

Il marshalling è in realtà abbastanza complicato .

Il comportamento che stai descrivendo si chiama "marshal-by-bleed", il runtime lo usa per eseguire il marshalling di stringhe (a volte) e il marshal System.Threading.Thread SEMPRE.

Per quanto posso dire che non hai alcun controllo su questo (è menzionato nell'articolo che puoi definire il comportamento di marshalling personalizzato ma non riesco a trovare alcuna documentazione su di esso), potresti potenzialmente passare un IntPtr in giro e usare un codice non sicuro per simularlo, ma per me ha un odore enorme.

Altri suggerimenti

Non credo, no. Credo che questo, come i primitivi, sia gestito direttamente dal runtime.

Hai solo due semantiche di marshalling in .NET Remoting: marshal per valore (SerializableAttribute) e marshal per riferimento (MarshalByRef).

Come hai accennato, le stringhe sono sottoposte a marshalling per valore, poiché System.String è decorato con l'attributo Serializable.

Se si desidera passare l'oggetto tra i domini dell'app e si desidera solo una copia (nessuna modifica sull'oggetto nel dominio dell'app remoto influisce sull'oggetto nel dominio dell'app locale), ciò che si desidera è utilizzare SerializableAttribute su la tua classe.

Spero che questo aiuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top