2009-05-05 14 views
12

Lorsque marshaling objets entre AppDomains dans .NET le CLR soit sérialiser l'objet (si elle a l'attribut Serializable) ou il va générer un proxy (si elle hérite de MarshalByRef)Puis-je demander au CLR de rassembler des objets immuables entre AppDomains par référence?

Avec des chaînes mais le CLR passe tout juste la référence à l'objet chaîne dans le nouvel AppDomain. Le CLR assure toujours l'intégrité puisque les chaînes .NET sont immuables et toute modification apportée par le second AppDomain à la chaîne n'affectera pas l'objet d'origine. Ce qui m'amène à ma question: existe-t-il un moyen de dire au CLR que mon type personnalisé est immuable et lorsqu'il est utilisé à distance il devrait juste passer la référence à l'objet comme il le fait avec la classe de chaînes?

+0

Vous ne savez pas si cela est lié, mais est-ce qu'il épingle la chaîne avant qu'elle ne la laisse traverser la limite? –

+0

Si par pin vous voulez dire comme un bloc {} fixe, alors non, l'épinglage est seulement utilisé lors de l'envoi de références d'objets dans un territoire non géré. – Yona

Répondre

7

Le brassage est actuellement fairly tricky. Le comportement que vous décrivez s'appelle "marshal-by-bleed", l'exécution l'utilise pour marshaler des chaînes (parfois) et marshal System.Threading.Thread ALWAYS. Dans la mesure où je peux vous dire que vous n'avez aucun contrôle sur cela (il est mentionné dans l'article que vous pouvez définir un comportement de triage personnalisé mais je ne trouve aucune documentation dessus), vous pourriez potentiellement passer un IntPtr code pour simuler cela, mais ça sent comme un énorme hack pour moi.

+1

grand +1 pour le lien, Marshall par Bleed est intéressant – ShuggyCoUk

1

Je ne pense pas, non. Je crois que ceci, comme les primitives, est géré directement par le runtime.

0

Vous n'avez que deux sémantiques de marshaling dans .NET Remoting: marshal par valeur (SerializableAttribute) et marshal par référence (MarshalByRef).

Comme vous l'avez mentionné, les chaînes sont rassemblées par valeur, car System.String est décoré avec SerializableAttribute. Si vous souhaitez passer votre objet entre les domaines d'application et que vous souhaitez en obtenir une copie (aucune modification de l'objet dans le domaine de l'application distante n'affecte l'objet dans le domaine de l'application locale), vous devez utiliser SerializableAttribute sur votre classe.

Espérons que cela aide.

+0

Désolé, le blog lié de sambo99 indique que vous avez tord, vous pouvez mettre à jour – ShuggyCoUk