我想知道,如何通过不同的AppDomain传递对象

时间:2017-03-03 08:38:24

标签: c# .net multithreading

我想知道,如何通过不同的AppDomain传递对象。一些例子将不胜感激。

1 个答案:

答案 0 :(得分:1)

为了在不同的应用程序域之间传递,对象必须从MarshalByRefObject继承或可序列化。前者适用于可变类型,而后者最适合不可变类型,因为任何在可序列化类型上更改属性值的尝试都只会影响当前域中的实例。

示例说明:

class MarshalledType : MarshalByRefObject {

    public int Value { get; set; }
}

[Serializable]
class SerializedType {

    public int Value { get; set; }
}

class Program {

    static void Main(string[] args) {
        AppDomain domain = AppDomain.CreateDomain("Second AppDomain");

        MarshalledType marshalled = (MarshalledType)domain.CreateInstanceAndUnwrap(
            typeof(MarshalledType).Assembly.FullName, 
            typeof(MarshalledType).FullName
        );

        // changes the property value in both domains
        marshalled.Value = 1;

        SerializedType serialized = (SerializedType)domain.CreateInstanceAndUnwrap(
            typeof(SerializedType).Assembly.FullName,
            typeof(SerializedType).FullName
        );

        // changes the property value in the current domain only
        serialized.Value = 1;
    }

}

您需要至少调用一次CreateInstanceAndUnwrap()方法才能在另一个AppDomain中实例化一个类型 - 但是,从那里您可以调用远程对象上的方法来传递域之间的其他对象。

如果您打算将远程对象一次保留在内存中超过几秒钟,则还必须考虑对象生存期(有关详细信息,请参阅ClientSponsor类)。

最后,请注意,处理远程对象上的事件可能会非常棘手。 Lambda表达式和匿名类型也可能导致远程处理问题。切勿尝试在应用程序域之间传递GUI对象。

希望这有帮助!