2009-08-09 146 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

相關問題