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

dev*_*ium 15 .net c# vb.net appdomain cross-domain

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

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"
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Rom*_*lle 22

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

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");
}
Run Code Online (Sandbox Code Playgroud)


Ore*_*ner 14

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

请参阅http://msdn.microsoft.com/en-us/library/system.appdomainsetup.appdomaininitializerarguments.aspx上的示例代码.

使用问题中的代码,更改可能看起来像(未测试):

static voide Main(string[] args) {
    _str = "abc";

    AppDomainSetup setup = new AppDomainSetup();
    setup.AppDomainInitializer = new AppDomainInitializer(MyNewAppDomainMethod);
    setup.AppDomainInitializerArguments = new string[] { _str };

    AppDomain domain = AppDomain.CreateDomain(
        "Domain666",
        new Evidence(AppDomain.CurrentDomain.Evidence),
        setup);

    Console.WriteLine("Finished");
    Console.ReadKey();
}

static void MyNewAppDomainMethod(string[] args) {
    ...
}
Run Code Online (Sandbox Code Playgroud)


小智 6

我知道这是一个老话题,但也许这将有助于其他正在研究该主题的人.

本文中,作者建议使用应用程序域SetDataGetData方法进行数据对象的基本交换,这些数据对象支持按值编组或按引用编组对象.