2009-08-09 7 views
8

を値を渡す:は、私は次のコードを持って、前後のAppDomain

public class AppDomainArgs : MarshalByRefObject { 
     public string myString; 
    } 

    static AppDomainArgs ada = new AppDomainArgs() { myString = "abc" }; 

    static void Main(string[] args) { 
     AppDomain domain = AppDomain.CreateDomain("Domain666"); 
     domain.DoCallBack(MyNewAppDomainMethod); 
     Console.WriteLine(ada.myString); 
     Console.ReadKey(); 
     AppDomain.Unload(domain); 
    } 

    static void MyNewAppDomainMethod() { 
     ada.myString = "working!"; 
    } 

を私はこれが私のada.myStringを持っているになるだろうと思っ作る「ワーキング!」メインのappdomainでは、しかしそれはしません。私は、MarshalByRefObjectから継承することによって、2番目のappdomainに加えられた変更が元のものにも反映されると考えました(これは、メインのappdomain上の実際のオブジェクトに対するプロキシであると思いました)。

おかげ

+0

ことだろうどのように –

答えて

17

あなたのコード内の問題は、あなたが実際に境界線の上にオブジェクトを渡すことはありませんということです。したがって、2つのadaインスタンスが各app-domainにあります(静的フィールド初期化子は両方のapp-domainsで実行されます)。あなたにはキックするMarshalByRefObject魔法のために境界上のインスタンスを渡す必要があります

たとえば:。

using System; 
class MyBoundaryObject : MarshalByRefObject { 
    public void SomeMethod(AppDomainArgs ada) { 
     Console.WriteLine(AppDomain.CurrentDomain.FriendlyName + "; executing"); 
     ada.myString = "working!"; 
    } 
} 
public class AppDomainArgs : MarshalByRefObject { 
    public string myString { get; set; } 
} 
static class Program { 
    static void Main() { 
     AppDomain domain = AppDomain.CreateDomain("Domain666"); 
     MyBoundaryObject boundary = (MyBoundaryObject) 
       domain.CreateInstanceAndUnwrap(
       typeof(MyBoundaryObject).Assembly.FullName, 
       typeof(MyBoundaryObject).FullName); 

     AppDomainArgs ada = new AppDomainArgs(); 
     ada.myString = "abc"; 
     Console.WriteLine("Before: " + ada.myString); 
     boundary.SomeMethod(ada); 
     Console.WriteLine("After: " + ada.myString);   
     Console.ReadKey(); 
     AppDomain.Unload(domain); 
    } 
} 
+0

(コメントとして説明のビットを追加しましたか)? :o –

+2

私は理解できません "どのようになるのだろうか?"追加されました。 –

+0

私はあなたのコードを実行し、それは私が探しているものです!ありがとう!ここでは、そこに何が入っているのかを慎重に見ていきます。 –

関連する問題