C# 如何将变量从一个应用程序域传递到另一个应用程序域

C# 如何将变量从一个应用程序域传递到另一个应用程序域,c#,.net,vb.net,cross-domain,appdomain,C#,.net,Vb.net,Cross Domain,Appdomain,我想知道,如果我有一个变量,例如字符串,如何将其值传递给我的新应用程序域: static string _str; static void Main(string[] args) { _str = "abc"; AppDomain domain = AppDomain.CreateDomain("Domain666"); domain.DoCallBack(MyNewAppDomainMethod); AppDomain.Unload(domain);

我想知道,如果我有一个变量,例如字符串,如何将其值传递给我的新应用程序域:

static string _str;

static void Main(string[] args) {
    _str = "abc";
    AppDomain domain = AppDomain.CreateDomain("Domain666");
    domain.DoCallBack(MyNewAppDomainMethod);
    AppDomain.Unload(domain);
    Console.WriteLine("Finished");
    Console.ReadKey();
}

static void MyNewAppDomainMethod() {
    Console.WriteLine(_str); //want this to print "abc"
}

谢谢

使用AppDomain.CreateDomain的一个变体,该变体采用AppDomainSetup参数。在AppDomainSetup对象中,将AppDomainInitializerArguments成员设置为要传递给新应用程序域的字符串数组

请参阅上的示例代码

对于问题中的代码,更改可能如下(未测试):


我知道这是一条古老的线索,但也许这会帮助其他正在研究这个课题的人


在中,作者建议使用application domain
SetData
GetData
方法对支持按值封送或按引用对象封送的数据对象进行基本交换。

解决第一个和第二个需求(传递一个值并检索另一个值),下面是一个非常简单的解决方案:

static void Main(string[] args)
{
    AppDomain domain = AppDomain.CreateDomain("Domain666");
    domain.SetData("str", "abc");
    domain.DoCallBack(MyNewAppDomainMethod);
    string str = domain.GetData("str") as string;
    Debug.Assert(str == "def");
}

static void MyNewAppDomainMethod()
{
    string str = AppDomain.CurrentDomain.GetData("str") as string;
    Debug.Assert(str == "abc");
    AppDomain.CurrentDomain.SetData("str", "def");
}

谢谢现在我想知道如何将信息返回到我的主appdomain。也就是说,返回一个对象。谢谢还有一个问题。我看到AppDomainInitializerArguments只接受字符串数组。在这种情况下,我实际上只需要字符串,所以没有问题,但是如果我需要其他类型的数据呢?对此无能为力?应用程序域不共享对象内存空间,因此传递对象需要某种序列化。要返回一个对象,您可以在原始的appdomain上进行DoCallBack,如果您能够得到它的话(我看不到一种简单的方法)。或者,您可以在appdomains之间建立其他形式的进程间通道,例如命名管道。这是一个很好的简单解决方案。谢谢我想强调的是,回调函数必须声明为静态,否则您将无法在新的AppDomain中工作。X
static void Main(string[] args)
{
    AppDomain domain = AppDomain.CreateDomain("Domain666");
    domain.SetData("str", "abc");
    domain.DoCallBack(MyNewAppDomainMethod);
    string str = domain.GetData("str") as string;
    Debug.Assert(str == "def");
}

static void MyNewAppDomainMethod()
{
    string str = AppDomain.CurrentDomain.GetData("str") as string;
    Debug.Assert(str == "abc");
    AppDomain.CurrentDomain.SetData("str", "def");
}