关于跨应用程序域边界的对象访问
2004-02-29 18:09
375 查看
一个应用程序域可以通过两种方式和另一个应用程序域进行通信。一种是传值(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会在目的应用程序域中创建一个代理对象,
目的应用程序域中引用的将是这个代理对象,它通过代理对象来调用源应用程序域中的对象。
由于它实际上调用的还是源应用程序域中的对象,因此线程要在两个应用程序域中跳转。
(参见.NET框架程序设计(修订版)P514)可以修改上面Test类部分代码来证实:
// [Serializable]
class Test : MarshalByRefObject
传值是通过对象的序列和反序列实现的,因此要传递的对象必须有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会在目的应用程序域中创建一个代理对象,
目的应用程序域中引用的将是这个代理对象,它通过代理对象来调用源应用程序域中的对象。
由于它实际上调用的还是源应用程序域中的对象,因此线程要在两个应用程序域中跳转。
(参见.NET框架程序设计(修订版)P514)可以修改上面Test类部分代码来证实:
// [Serializable]
class Test : MarshalByRefObject
相关文章推荐
- ASP.NET缓存引起的问题
- >>Singleton模式挺好的
- Excel版俄罗斯方块
- 字符串黑箱的背后
- 品味孤独
- 杭州ERPTAO组织成功举办第一次技术讲座
- 在VC中用CMenuXP使应用程序拥有Office XP风格的界面
- 区分保留字跟关键字
- 区分保留字跟关键字
- 向Visual Basic程序员介绍泛型(二)
- 我与Javascript 随笔(二)
- 走进JBoss (1)
- 走进JBoss (2)
- IP地址输入控件 V1.0.1.1版(FOR Win Form)
- 其它技术和Hibernate-XDoclet
- 自定义组件之属性(Property)的性质(Attribute)介绍(四)
- 自定义组件之属性(Property)的性质(Attribute)介绍(三)
- 自定义组件之属性(Property)的性质(Attribute)介绍(二)
- 自定义组件之属性(Property)的性质(Attribute)介绍(一)
- 需求分析概述