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í?
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.
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.
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