永春阁
专注于技术,切不可沉湎于技术
博客园
首页
博问
闪存
新随笔
联系
订阅
管理
随笔-250 文章-0 评论-1516
C#强化系列文章六:应用程序域(AppDomain)浅析
在以前传统的开发中我们都知道,一个应用程序对应一个进程,并为该进程指定虚拟内存,由操作系统来映射实际的物理内存,有效的维护了进程之间的安全性。但另一方面,每一个进程都会消耗一定的系统资源,降低了性能,并且进程间的通信也比较麻烦。
在.Net中推出了一个新的概念:应用程序域(AppDomain)。可以理解成很多应用程序域都可以运行在同一个.NET的进程中,可以降低系统消耗,同时不同的域之间互相隔离,在安全性方面有保障。另外对于同一个进程内不同域之间的通信也相对简单一点。
应用程序域涉及的内容很多,本文就简要描述以下两个方面:
1、如何创建、卸载域
2、如何实现域间的通信
一、如何创建、卸载域
在.NET中提供了AppDomain类为执行托管代码提供隔离、卸载和安全边界。
1
AppDomainSetup info
=
new
AppDomainSetup();
2
info.LoaderOptimization
=
LoaderOptimization.SingleDomain;
3
4
AppDomain domain
=
AppDomain.CreateDomain(
"
MyDomain
"
,
null
, info);
5
domain.ExecuteAssembly(
"
C:\\test\\DomainCom.exe
"
);
6
AppDomain.Unload(domain);
7
1、使用AppDomainSetup类定义新域的属性,比如可以设置应用程序的根目录,设置被加载程序的类别。
例子中使用的是
SingleDomain
表示加载程序不得在应用程序域之间共享内部资源,还可以使用
MultiDomain、
MultiDomainHost
等其他属性
2、在第四行创建一个名字为MyDomain的新域
3、在第5行在新域内部执行一个应用程序
4、第6行卸载这个新域
通过这样创建后,新域的执行就算出现系统异常也不会影响到原来域的执行,那么就可以做类似WatchDog(监控子程序,一旦退出就重启)的程序了
二、如何实现域间的通信
公共语言运行库禁止在不同域中的对象之间进行直接调用,但我们可以复制这些对象,或通过代理访问这些对象
1
AppDomainSetup info2
=
new
AppDomainSetup();
2
info2.LoaderOptimization
=
LoaderOptimization.SingleDomain;
3
info2.ApplicationBase
=
"
C:\\test
"
;
4
AppDomain domain2
=
AppDomain.CreateDomain(
"
MyDomain2
"
,
null
, info2);
5
ObjectHandle objHandle
=
domain2.CreateInstance(
"
DomainCom
"
,
"
DomainCom.TestStatic
"
);
6
ICollection obj
=
objHandle.Unwrap()
as
ICollection;
7
int
i
=
obj.Count;
8
domain2.ExecuteAssembly(
"
C:\\test\\DomainCom.exe
"
);
9
AppDomain.Unload(domain2);
开始的代码都差不多,重点是以下几个方面:
1、第5行在新域中创建一个对象(类DomainCom.TestStatic),并返回一个代理ObjectHandle 类用于在多个应用程序域之间传递对象
DomainCom.TestStatic必须从MarshalByRefObject类继承,为了演示方便,这个类很简单,从ICollection接口继承,就实现了一个Count属性:
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Collections;
namespace
DomainCom
{
public
class
TestStatic : MarshalByRefObject, ICollection
{
private
static
int
count
=
1
;
public
int
Count
{
get
{
count
=
count
*
2
;
return
count;
}
}
未实现代码
#region
未实现代码
public
bool
IsSynchronized
{
get
{
throw
new
NotImplementedException(); }
}
public
object
SyncRoot
{
get
{
throw
new
NotImplementedException(); }
}
public
void
CopyTo(Array array,
int
index)
{
throw
new
NotImplementedException();
}
public
IEnumerator GetEnumerator()
{
throw
new
NotImplementedException();
}
#endregion
}
}
2、第6行取得新域中的对象
3、在第七在当前域中给新域中的对象赋值
4、第8行执行新域中的应用程序,这个应用程序中就是弹出一个对话框显示Count的值
TestStatic test
=
new
TestStatic();
MessageBox.Show(test.Count.ToString());
得到的结果为
4,
证明实现了域间对象的互操作,这样我们就可以实现其他更复杂的操作了。
绿色通道:
好文要顶
关注我
收藏该文
与我联系
posted @ 2008-03-14 16:45
永春
阅读(7969)
评论(9)
编辑
收藏
发表评论
2181231
回复
引用
查看
#1楼
2008-03-14 17:37
sopper
程序域(AppDomain)还有这么些用法啊
长见识
学习
回复
引用
查看
#2楼
2008-03-14 20:31
BlueMountain
感觉lz很多地方没怎么说清楚。
----------------------------------------------------------------
二、如何实现域间的通信
公共语言运行库禁止在不同域中的对象之间进行直接调用,但我们可以复制这些对象,或通过代理访问这些对象
如果对象透过应用程序appdomain,必须可以被序列化。
[seriable]
class AcrossAppDomain
如果对象继承自MarshalByRefObject,可以跨appdomain被调用
class CallAcrossAppDomain : MarshalByRefObject
回复
引用
查看
#3楼
[
楼主
]
2008-03-17 12:50
永春
@BlueMountain
继承自MarshalByRefObject我也提到了,不过没有具体来说
谢谢你的补充
回复
引用
查看
#4楼
2008-09-05 14:16
谢小妹
还是有一点不懂!mark!!以后再看!
回复
引用
查看
#5楼
2008-11-26 10:20
劲草
你好,问你一个问题,我的Dll 文件分了两个,一个是接口类,另一个是子类继承了接口,两个类不在同一个Dll文件里。
var DomainInstance = (TriggerDesignerFacadeBase)Domain.CreateInstanceFromAndUnwrap(FileName, "Workflow.TriggerDesignerFacade");
在创建域间通讯实例时,就抛出异常:System.TypeLoadException was caught
"Could not load type 'Workflow.TriggerDesignerFacade' from assembly 'Trigger_Time, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' because the parent type is an interface."
如何解决呢
回复
引用
查看
#6楼
2010-11-24 11:57
doctor
做个记号.
回复
引用
查看
#7楼
2011-08-19 16:36
shenopkss
mark
注册用户登录后才能发表评论,请
登录
或
注册
,
返回博客园首页
。
首页
博问
闪存
新闻
园子
招聘
知识库
最新IT新闻
:
·
Chrome将给老机带来更快的3D绘图性能
·
在线支付创业公司Stripe获红杉资本等1800万美元的投资,公司估值达1亿美元
·
创新工场孵化公司磊友科技今天正式推出首款大型手机HTML5网页游戏《黎明帝国》
·
霍金的伟大与不幸
·
Linux为什么成功?因为它的失败是免费的!
»
更多新闻...
最新知识库文章
:
·
高级编程语言的发展历程
·
如何学习一门新的编程语言?
·
学习不同编程语言的重要性
·
为什么我喜欢富于表达性的编程语言
·
计算机专业的女生为什么要学编程
»
更多知识库文章...
China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
公告
本Blog版权均为本人所有,欢迎任何媒体和网站转载本人博客的内容。
本Blog的内容按原样提供,本人不提供任何形式的担保。
转载请注明出处
本公司专注于音视频、图形图像编码转换等相关开发,承接各种相关项目。(gaochun@zhisoft.com)
自2007年3月8日:
系列文章
1、
Sharepoint2007对象模型系列
2、
C#强化系列文章
3、
MOSS SDK学习系列
4、
IBatis.Net学习笔记系列
5、
MonoRail学习笔记系列
昵称:
永春
园龄:
5年7个月
粉丝:
66
关注:
3
<
2008年3月
>
日
一
二
三
四
五
六
24
25
26
27
28
29
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
搜索
常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
随笔分类
.Net(50)
(rss)
AJax(3)
(rss)
C++/VC学习(2)
(rss)
iBATIS.NET(15)
(rss)
Java(6)
(rss)
MonoRail(25)
(rss)
OS Shell(5)
(rss)
SharePoint(42)
(rss)
Windows Server(1)
(rss)
XHTML/CSS/Script(6)
(rss)
创业(3)
(rss)
企业开发(2)
(rss)
数据库(21)
(rss)
外语(1)
(rss)
项目管理(7)
(rss)
音视频、图形相关开发
(rss)
娱乐/杂记/修养(54)
(rss)
随笔档案
2010年4月 (1)
2010年3月 (1)
2010年2月 (2)
2009年4月 (1)
2009年2月 (2)
2009年1月 (1)
2008年11月 (1)
2008年10月 (1)
2008年9月 (1)
2008年8月 (3)
2008年7月 (7)
2008年6月 (1)
2008年5月 (2)
2008年4月 (12)
2008年3月 (14)
2008年2月 (3)
2008年1月 (14)
2007年12月 (17)
2007年11月 (20)
2007年10月 (31)
2007年9月 (13)
2007年8月 (25)
2007年7月 (10)
2007年6月 (1)
2007年5月 (2)
2007年4月 (10)
2007年3月 (15)
2007年2月 (7)
2007年1月 (1)
2006年12月 (3)
2006年11月 (21)
2006年10月 (5)
2006年8月 (2)
SharePoint学习
Codeplex Sharepoint
jianyi @ cnblogs
Kaneboy's Blog
Patrick Tisseghem's Blog
管理相关
下载_中计在线
中国管理之家
开源社区
C#开源资源大全
Java开源大全
SourceForge主页
门户网站
南京程序员俱乐部
积分与排名
积分 - 577931
排名 - 89
最新评论
阅读排行榜