在appdomains中来回传递值

时间:2009-08-09 05:59:06

标签: c# .net vb.net remoting 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,在第二个appdomain上进行的任何更改也会反映在原始appdomain中(我认为这只是主应用程序域上真实对象的代理!)?

由于

1 个答案:

答案 0 :(得分:20)

您的代码中的问题是您从未实际通过边界传递对象;因此,你有两个 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);
     }
}