关于跨应用程序域边界的对象访问(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会在目的应用程序域中创建一个代理对象,
目的应用程序域中引用的将是这个代理对象,它通过代理对象来调用源应用程序域中的对象。
由于它实际上调用的还是源应用程序域中的对象,因此线程要在两个应用程序域中跳转。
一个应用程序域可以通过两种方式和另一个应用程序域进行通信。一种是传值(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会在目的应用程序域中创建一个代理对象,
目的应用程序域中引用的将是这个代理对象,它通过代理对象来调用源应用程序域中的对象。
由于它实际上调用的还是源应用程序域中的对象,因此线程要在两个应用程序域中跳转。
相关文章推荐
- 关于跨应用程序域边界的对象访问
- 关于跨应用程序域边界的对象访问
- 关于文本对象的剪切(Clip)属性:如何调整对象的显示边界
- (转)关于用文件系统TextStream对象实现网页访问浏览人数统计
- 应用程序中的所有线程都可以访问方法中的公用字段。要同步对公用字段的访问,您可以使用属性替代字段,并使用 ReaderWriterLock 对象控制访问。为此,请按照下列步骤操作:
- 关于asp.net 下发送邮件 未能访问"CDO.Message"对象 问题(1)
- JS 关于对象属性的访问
- 使用 .NET 远程处理访问其他应用程序域中的对象
- 关于类成员函数中访问同类对象的私有成员
- 关于类成员函数中访问同类对象的私有成员
- 关于IIS上发布asp.net应用程序让外网用户访问问题
- 关于访问C++类对象中私有成员变量的方法,不考虑用友元
- ZZ:使用.NET语言开发Silverlight应用程序入门(二):界面和对象模型
- 关于System.Web.Mail发送邮件报“未能访问"CDO.Message"对象”的解决
- 关于WinCE6.0 应用程序中直接访问物理地址
- Android中关于JNI 的学习(三)在JNI层访问Java端对象
- 关于 LOCAL_SDK_VERSION 使应用程序不能访问hide的api
- 【转】Java虚拟机学习 - 对象访问 - 【关于栈 跟 堆】
- ZZ:使用.NET语言开发Silverlight应用程序入门(二):界面和对象模型
- 控制台应用程序访问SharePoint对象的注意事项