【问题标题】:Passing values back and forth appdomains来回传递值 appdomains
【发布时间】:2009-08-09 05:59:06
【问题描述】:

我有以下代码:

    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 上真实对象的代理!)?

谢谢

【问题讨论】:

  • (添加了一点解释作为评论)
  • 还要记住,为了跨域传递对象,它必须是可序列化的。正如我在浪费了很多天后发现的那样,这遗漏了许多 .NET 对象。

标签: c# .net vb.net remoting appdomain


【解决方案1】:

您的代码中的问题是您实际上从未将对象传递到边界之外;因此,您有 两个 ada 实例,每个应用程序域中都有一个(静态字段初始化程序在两个应用程序域上运行)。您需要将实例越过边界,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);
     }
}

【讨论】:

  • 我不明白“那会怎样?”,但如果你想要一个例子;已添加。
  • 我只是运行你的代码,它会做我想要的!谢谢!现在我将仔细查看它以了解其中发生的情况。
  • 重点;我需要一个方法 (SomeMethod) 将AppDomainArgs 的实例传递到边界上;此方法必须自身位于MarshalByRefObject 上,并且我们希望MyBoundaryObject 对象位于另一个应用程序域(CreateInstanceAndUnwrap)中。
  • 但是我的代码有什么原因,Main() 和 MyNewAppDomainMethod() 都引用了一个全局变量,实际上并没有引用同一个变量?它不应该与声明变量并将其传递给方法相同吗,就像您在 MyBoudaryObject.SomeMethod() 中所做的那样?
  • 简单;实例字段由实例限定;静态字段由AppDomain 限定。您对ada 的引用实际上是“当前应用程序域中的ada” - 这与Main(在主应用程序域上执行)和MyNewAppDomainMethod(在"Domain666" 中执行)中的代码不同.重新预订 - 我不知道,抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
相关资源
最近更新 更多