在appdomains中来回传递值

dev*_*ium 9 .net c# 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!";
    }
Run Code Online (Sandbox Code Playgroud)

我想这会让我的ada.myString"工作!" 在主appdomain上,但它没有.我认为通过继承MarshalByRefObject,在第二个应用程序域上所做的任何更改也会反映在原始应用程序中(我认为这只是主appdomain上真实对象的代理!)?

谢谢

Mar*_*ell 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);
     }
}
Run Code Online (Sandbox Code Playgroud)

  • 我不明白"怎么会这样?",但如果你想要一个例子; 添加. (2认同)
  • 重点; 我需要一个方法(`SomeMethod`),它在边界上传递一个'AppDomainArgs`实例; 这个方法必须*本身*在一个`MarshalByRefObject`上,我们希望`MyBoundaryObject`对象在另一个app-domain(`CreateInstanceAndUnwrap`)中. (2认同)
  • 只是; 实例字段由实例确定范围; 静态字段由`AppDomain`确定范围.您对"ada"的引用实际上是"当前app-domain中的'ada`" - 这与"Main"(在主app-domain上执行)和"MyNewAppDomainMethod"(在"Domain666"中执行)中的代码不同`).重新书 - 我不知道,对不起. (2认同)