Question

Lors du marshaling d'objets entre AppDomains dans .NET, le CLR sérialisera l'objet (s'il possède l'attribut Serializable ) ou générera un proxy (s'il hérite de MarshalByRef )

Avec les chaînes, le CLR passera simplement la référence à l'objet chaîne dans le nouvel AppDomain. L’intégrité du CLR est toujours garantie, car les chaînes .NET sont immuables et toute modification apportée par la deuxième valeur AppDomain à la chaîne n’affectera pas l’objet d’origine.

Ce qui m'amène à ma question: y a-t-il un moyen de dire au CLR que mon type personnalisé est immuable et lorsqu'il est utilisé dans la communication à distance, il doit simplement transmettre la référence à l'objet comme avec la classe string?

Était-ce utile?

La solution

La

planification est en réalité assez complexe .

Le comportement que vous décrivez s'appelle "marshal-by-bleed", le moteur d’exécution l’utilise pour marshaler des chaînes (parfois) et pour marshal System.Threading.Thread TOUJOURS.

Autant que je sache, 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 que je ne trouve aucune documentation dessus), vous pourriez potentiellement transmettre un IntPtr et utiliser du code non sécurisé. pour simuler cela, mais ça sent comme un énorme bidouillage pour moi.

Autres conseils

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

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

Comme vous l'avez dit, les chaînes sont classées par valeur, car System.String est décoré avec le SerializableAttribute.

Si vous souhaitez passer votre objet entre des domaines d'application et que vous ne voulez qu'une copie (aucune modification de l'objet dans le domaine d'application distant n'affecte l'objet du domaine d'application local), vous souhaitez alors utiliser l'attribut SerializableAttribute. votre classe.

J'espère que cela vous aidera.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top