Posso dire al CLR di eseguire il marshalling di oggetti immutabili tra AppDomains per riferimento?
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?
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.