Как передать переменную из одного домена приложения в другой
Я хотел бы знать, если у меня есть переменная, например, строка, как передать ее значение в мой новый домен приложения:
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"
}
Спасибо
Ответы
Ответ 1
Используйте один из вариантов 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) {
...
}
Ответ 2
Адресация ваших первых и вторых требований (переход через значение и получение другого значения обратно), вот довольно простое решение:
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");
}
Ответ 3
Я знаю, что это старый поток, но, возможно, это поможет другим людям, которые исследуют этот предмет.
В в этой статье автор предлагает использовать методы приложения SetData
и GetData
для базового обмена объектами данных, которые поддерживают маршал- по значению или маршала по ссылке.