如何从一个应用程序域传递一个变量到另一个
问题描述:
我想知道,如果我有一个变量,例如,一个字符串,怎么它的价值传递给我的新的应用领域:如何从一个应用程序域传递一个变量到另一个
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"
}
谢谢
答
使用需要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) {
...
}
答
我知道这是一个古老的线程,但也许这会帮助谁正在研究这个问题的其他人。
在this article,作者建议使用的应用程序域和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");
}
+0
谢谢,这对我来说是最好的答案! – bas 2014-05-05 07:00:37
谢谢。现在我想知道如何将信息返回到我的主要应用程序域。也就是说,返回一个对象。谢谢! – 2009-08-09 05:42:55
还有另外一个问题。我看到AppDomainInitializerArguments只接受一个字符串数组。在这种情况下,我真的只想要字符串,所以没有问题,但如果我想要其他类型的数据呢?没有关系呢? – 2009-08-09 05:47:35
应用程序域不共享对象内存空间,因此传递对象需要某种类型的序列化。要返回一个对象,你可以在原有的AppDomain上进行DoCallBack操作,如果你能掌握它的话(尽管我看不到这样做的简单方法)。或者,你可以在应用程序域之间建立一些其他形式的进程间通道。一个命名管道。 – 2009-08-09 06:03:28