Instancias variables estáticas y AppDomains, ¿qué está sucediendo?


Tengo

public static class A
{
   public static string ConnString;
}

[Serializable]
public class Test{
   // Accesing A's field;
   public string ConnString{get{return A.ConnString;}set{A.ConnString=value;}}
}

void Main()
{
   A.ConnString = "InitialString"; // I set A.ConnString in the current domain

   var newDomain = AppDomain.CreateDomain("DomNew");
   Test TObj = newDomain.CreateInstanceAndUnwrap(typeof(Test).Assembly.FullName, typeof(Test).FullName) as Test ;

   TObj.ConnString = "NewDomainString"; // It is supposed to set A.ConnString in the newDomain aka a different instance of A.ConnString

   // Here it is supposed to print two different values
   Console.WriteLine(A.ConnString);  // "InitialString"
   Console.WriteLine(TObj.ConnString); // "NewDomainString"
}

¡Pero NO! Las dos líneas de escritura, imprimen el mismo valor "NewDomainString"! ¿POR QUÉ???

Este código

TObj.ConnString = "NewDomainString"

Se supone que cambia la cadena en el dominio recién creado, pero parece que ambos se refieren a la misma instancia!

¿por Qué, qué está pasando aquí?

Author: John Saunders, 2012-03-21

2 answers

Solo hay dos formas de que una clase sea accesible desde otro AppDomain: una es si la clase es [Serializable], como su clase de prueba, la otra es si la clase hereda de MarshalByRefObject. Debido a que su clase es serializable, se crea una copia de ella para cada llamada entre AppDomain. Así que el Test que el appdomain principal obtiene cuando llama...

Test TObj = newDomain.CreateInstanceAndUnwrap(typeof(Test).Assembly.FullName, typeof(Test).FullName) as Test;

En realidad no es la instancia de prueba que se creó en el AppDomain" DomNew "- es una copia local al " main" AppDomain, y por lo tanto hace referencia a las variables estáticas del AppDomain "principal".

Si desea que Test muestre el comportamiento que espera, haga que herede de MarshalByRefObject en lugar de serializable.

 21
Author: Chris Shain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-21 15:52:20

Ha marcado su clase de prueba como Serializable. Esto está mal. Deberías haber derivado de MarshalByRef. De lo contrario, TObj solo será una copia local en el AppDomain actual.

 12
Author: Dirk Bonné,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-21 15:36:15