您的位置:首页 > 其它

关于跨应用程序域边界的对象访问(zz)

2009-03-28 15:34 281 查看
(zzfrom:http://blog.csdn.net/jxufewbt/archive/2007/07/29/1715152.aspx)

一个应用程序域可以通过两种方式和另一个应用程序域进行通信。一种是传值(by value),另一种是传引用(by reference)

传值是通过对象的序列和反序列实现的,因此要传递的对象必须有System.Serializable属性.

它的实现原理:我们在应用程序域A中构造了一个对象A1,现在要将对象A1的引用传递给另

一个应用程序域B,CLR首先会将对象A1的字段序列化到一个内存块,然后再将这个内存块的地址

传递给另一应用程序域B,将由应用程序域B反序列化得对新的对象B1,因此这个新的对象B1应该是在

应用程序域A中。

可以通过以下代码来证实:

using System;

using System.Reflection;

using System.Threading;

using System.Runtime.Serialization;

class App {

static void Main() {

AppDomain domain = AppDomain.CreateDomain("MyNewDomain", null, null);

Test test = (Test) domain.CreateInstanceAndUnwrap(

Assembly.GetCallingAssembly().FullName, "Test");

test.TestMethod(Thread.GetDomain().FriendlyName);

AppDomain.Unload(domain);

}

}

[Serializable]

class Test// : MarshalByRefObject

{

public void TestMethod(string srcAppDomain) {

Console.WriteLine(

"Code from the '{0}' AppDomain\n" +

"called into the '{1}'. AppDomain.",

srcAppDomain, Thread.GetDomain().FriendlyName);

}

}

而传引用则能过创建代理对象来实现,传递的对象要从System.MarshalByRefObject类继承。

当对象的引用传递到另一应用程序域中时,CLR会在目的应用程序域中创建一个代理对象,

目的应用程序域中引用的将是这个代理对象,它通过代理对象来调用源应用程序域中的对象。

由于它实际上调用的还是源应用程序域中的对象,因此线程要在两个应用程序域中跳转。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐