property - variables static c#
Instancias de variables estáticas y dominios de aplicaciones, ¿qué está pasando? (2)
Has marcado tu 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 dominio de aplicación actual.
yo 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! Los dos WriteLines, 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í?
Solo hay dos formas de acceder a una clase desde otro dominio de aplicación: una es 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 para cada llamada de dominio de aplicación cruzada. Así que la Test
que obtiene el principal dominio de la aplicación cuando llamas ...
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 dominio de aplicación "DomNew"; es una copia local del dominio de aplicación "principal" y, por lo tanto, hace referencia a las variables estáticas del dominio de aplicación "principal".
Si desea que Test
muestre el comportamiento que espera, hágalo heredar de MarshalByRefObject en lugar de ser serializable.