Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 静态变量实例和AppDomains,发生了什么?_C#_Variables_Static_Instance_Appdomain - Fatal编程技术网

C# 静态变量实例和AppDomains,发生了什么?

C# 静态变量实例和AppDomains,发生了什么?,c#,variables,static,instance,appdomain,C#,Variables,Static,Instance,Appdomain,我有 但是没有!两个WriteLine,打印出相同的值“NewDomainString”! 为什么 此代码 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=val

我有

但是没有!两个WriteLine,打印出相同的值“NewDomainString”! 为什么

此代码

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"
}
应该更改新创建的域中的字符串,但它们似乎都引用同一个实例


为什么,这里发生了什么?

只有两种方法可以从另一个AppDomain访问类-一种是类是
[Serializable]
,就像测试类一样,另一种是如果类继承自。因为您的类是可序列化的,所以会为每个跨AppDomain调用创建它的副本。因此,主appdomain在调用时获得的
测试

TObj.ConnString = "NewDomainString"
实际上不是在“DomNew”AppDomain中创建的测试实例-它是“main”AppDomain的本地副本,因此引用了“main”AppDomain中的静态变量


如果希望
Test
显示预期的行为,请使其从MarshalByRefObject继承,而不是可序列化。

将测试类标记为可序列化。这是错误的。您应该从MarshalByRef派生。否则TObj将只是当前AppDomain中的本地副本。

可能的副本请不要在标题前加上“C#”之类的前缀。这就是标签的作用。你说得对,约翰!这里的新手:)我在学习!谢谢达雅,你说得对。我的搜索仅限于“静态变量”,我错过了“静态字段”部分:)妮特:实际上还有第三种方法。流血元帅@JaredPar yikes,是的。。。让我畏缩。Thanx,这正是我想要的。在我提出这个问题后不久,碰巧我自己找到了答案。出于某种原因,我没有尝试MarshalByRef继承,尽管我知道有这样的事情。我想我被另一个论坛的回答误导了,说这两种方式(可序列化属性和MarshalByRef继承)是相同的。尽管如此,我认为如果Serializable Attirbute是制作类的“本地”副本的一种方法,那么您实际上不会从另一个域访问对象,对吗?只是从另一个域“读取”对象的状态吗?
Test TObj = newDomain.CreateInstanceAndUnwrap(typeof(Test).Assembly.FullName, typeof(Test).FullName) as Test;