Как передать переменную из одного домена приложения в другой - PullRequest
15 голосов
/ 09 августа 2009

Я хотел бы знать, если у меня есть переменная, например, строка, как передать ее значение в мой новый домен приложения:

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

Спасибо

Ответы [ 3 ]

21 голосов
/ 25 сентября 2013

Обращаясь к вашим первым и вторым требованиям (прохождение значения и получение другого значения обратно), вот довольно простое решение:

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");
}
14 голосов
/ 09 августа 2009

Используйте один из вариантов AppDomain.CreateDomain, который принимает аргумент AppDomainSetup. В объекте 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) {
    ...
}
6 голосов
/ 16 июня 2011

Я знаю, что это старая ветка, но, возможно, это поможет другим людям, которые исследуют эту тему.

В этой статье автор предлагает использовать область приложения SetData и GetData для базового обмена объектами данных, которые поддерживают маршал по значению или маршал по ссылке.

...