gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:27:11 24 4
gpt4 key购买 nike

我有

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"
}

但是不!两条WriteLines,打印出相同的值“NewDomainString”!为什么???

这段代码

TObj.ConnString = "NewDomainString"

应该更改新创建的域中的字符串,但它们似乎都引用同一个实例!

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

最佳答案

只有两种方法可以从另一个 AppDomain 访问一个类 - 一种是该类是 [Serializable],就像您的 Test 类一样,另一种是该类继承自 MarshalByRefObject .因为您的类是可序列化的,所以会为每个跨 AppDomain 调用创建它的副本。所以 Test 当你调用时主应用程序域得到...

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

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

如果您希望 Test 表现出您期望的行为,请使其继承自 MarshalByRefObject 而不是 Serializable。

关于c# - 静态变量实例和 AppDomains,发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9806372/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com