2009-08-09 144 views
11

我想知道,如果我有一个变量,例如,一个字符串,怎么它的价值传递给我的新的应用领域:如何从一个应用程序域传递一个变量到另一个

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

谢谢

回答

11

使用需要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) { 
    ... 
} 
+1

谢谢。现在我想知道如何将信息返回到我的主要应用程序域。也就是说,返回一个对象。谢谢! – 2009-08-09 05:42:55

+0

还有另外一个问题。我看到AppDomainInitializerArguments只接受一个字符串数组。在这种情况下,我真的只想要字符串,所以没有问题,但如果我想要其他类型的数据呢?没有关系呢? – 2009-08-09 05:47:35

+0

应用程序域不共享对象内存空间,因此传递对象需要某种类型的序列化。要返回一个对象,你可以在原有的AppDomain上进行DoCallBack操作,如果你能掌握它的话(尽管我看不到这样做的简单方法)。或者,你可以在应用程序域之间建立一些其他形式的进程间通道。一个命名管道。 – 2009-08-09 06:03:28

4

我知道这是一个古老的线程,但也许这会帮助谁正在研究这个问题的其他人。

this article,作者建议使用的应用程序域和SetDataGetData方法的数据对象的基本交换支持编组按值或编组通过引用对象。

17

既解决您的第一和第二的需求(通过一个值和检索另一个值回),这里是一个非常简单的解决方案:

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

相关问题