2009-05-05 15 views
12

Quando marshalling oggetti tra AppDomain NET CLR sarà o serializzare l'oggetto (se ha l'attributo Serializable) o si genererà un proxy (se eredita da MarshalByRef)Posso dire al CLR di eseguire il marshalling di oggetti immutabili tra AppDomains per riferimento?

Con stringhe tuttavia CLR sarà sufficiente passare il riferimento all'oggetto stringa nel nuovo AppDomain. Il CLR garantisce ancora l'integrità poiché le stringhe .NET sono immutabili e qualsiasi modifica apportata dal secondo AppDomain alla stringa non influirà 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 viene utilizzato in remotazione dovrebbe semplicemente passare il riferimento all'oggetto come fa con la classe stringa?

+0

Non è sicuro se questo è correlato, ma pin la stringa prima che consenta di attraversare il confine? –

+0

Se per pin si intende come un blocco {} fisso, quindi no, il pinning viene utilizzato solo quando si inviano riferimenti a oggetti nel territorio non gestito. – Yona

risposta

7

Il marshalling è in realtà fairly tricky.

Il comportamento si sta descrivendo è chiamato "marshal-by-sanguinare", il runtime usa per schierare le stringhe (a volte) e il maresciallo System.Threading.Thread SEMPRE.

Per quanto posso dire che non si ha alcun controllo su questo (è menzionato nell'articolo che è possibile definire il comportamento di marshalling personalizzato ma non riesco a trovare alcuna documentazione su di esso), si potrebbe potenzialmente passare un IntPtr in giro e usare non sicuro codice per simulare questo, ma puzza come un enorme hack per me.

+1

grande +1 per il link, Marshall di Bleed è interessante – ShuggyCoUk

1

Io non la penso così, no. Credo che questo, come i primitivi, sia gestito direttamente dal runtime.

0

Si dispone solo di due semantica di marshalling in .NET Remoting: marshal per valore (SerializableAttribute) e marshall per riferimento (MarshalByRef).

Come si è accennato, le stringhe vengono ordinate per valore, poiché System.String è decorato con SerializableAttribute.

Se si desidera passare l'oggetto tra domini app e si desidera solo una copia (nessuna modifica sull'oggetto nel dominio dell'app remota influisce sull'oggetto nel dominio dell'app locale), quindi si desidera utilizzare SerializableAttribute sulla tua classe

Spero che questo aiuti.

+0

Scusa il blog collegato di sambo99 indica che hai torto, potresti voler aggiornare – ShuggyCoUk

Problemi correlati