Pregunta

Al calcular los objetos entre AppDomains en .NET, el CLR serializará el objeto (si tiene el atributo Serializable ) o generará un proxy (si se hereda de MarshalByRef )

Con cadenas, sin embargo, el CLR solo pasará la referencia al objeto de cadena en el nuevo dominio de aplicación. El CLR aún garantiza la integridad ya que las cadenas .NET son inmutables y cualquier cambio realizado por el segundo AppDomain a la cadena no afectará al objeto original.

Lo que me lleva a mi pregunta: ¿hay alguna manera de decirle al CLR que mi tipo personalizado es inmutable y que cuando se usa en forma remota solo debe pasar la referencia al objeto como lo hace con la clase de cadena?

¿Fue útil?

Solución

Marshalling es en realidad bastante complicado .

El comportamiento que está describiendo se denomina "marshal-by-bleed", el tiempo de ejecución lo utiliza para ordenar cadenas (a veces) y marshal System.Threading.Thread ALWAYS.

Por lo que puedo decir que no tiene control sobre esto (se menciona en el artículo que puede definir un comportamiento de cálculo personalizado, pero no puedo encontrar ninguna documentación), podría pasar un IntPtr y usar un código inseguro. Para simular esto, pero me huele como un gran truco.

Otros consejos

No lo creo, no. Creo que esto, como las primitivas, es manejado directamente por el tiempo de ejecución.

Solo tiene dos semánticas de cálculo de referencias en .NET Remoting: marshal por valor (SerializableAttribute) y marshal por referencia (MarshalByRef).

Como mencionó anteriormente, las cadenas se ordenan por valor, ya que System.String está decorado con el atributo SerializableAttribute.

Si desea pasar su objeto entre los dominios de la aplicación y solo desea una copia (no hay cambios en el objeto en el dominio de la aplicación remota que afecte al objeto en el dominio de la aplicación local), entonces lo que desea es usar el atributo SerializableAttribute en tu clase.

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top