频道栏目
读书频道 > web开发 > .NET > .NET安全揭秘
3.3.1 托管宿主
2012-10-24 16:43:16     我来说两句
收藏   我要投稿

本文所属图书 > .NET安全揭秘

全书共分为五个部分。第一部分:.NET安全基础,透彻讲解了.NET体系结构、程序集与反射、应用程序域和CLR寄宿等核心技术,这部分内容是.NET架构的核心,同时也是理解.NET底层安全机制的基础;第二部分:.NET平台安...  立即去当当网订购

通过托管代码来管理CLR的方式,称为托管宿主。想实现托管宿主很简单,只要实现System.AppDomainManager类就可以了。AppDomainManager类的定义如代码清单3-12所示。

代码清单3-12AppDomainManager类定义

[ComVisibleAttribute(true)]
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure)]
[SecurityPermissionAttribute(SecurityAction.InheritanceDemand, Flags = SecurityPermissionFlag.Infrastructure)]
public class AppDomainManager : MarshalByRefObject

要实现自己的托管宿主需要实现一个AppDomainManager类的子类,重写其中的虚方法。代码清单3-13自定义XHAppDomainManager类来实现简单的托管宿主。

3-13自定义XHAppDomainManager类

namespace 托管宿主
{
[GuidAttribute("F4D15099-3407-4A7E-A607-DEA440CF3891")]
[SecurityPermissionAttribute(SecurityAction.LinkDemand,
Flags = SecurityPermissionFlag.Infrastructure)]
[SecurityPermissionAttribute(SecurityAction.InheritanceDemand, Flags = SecurityPermissionFlag.Infrastructure)]
class XHAppDomainManager:AppDomainManager
{
private HostSecurityManager XHHostSecurityManager = null;
public override void InitializeNewDomain(AppDomainSetup appDomainInfo)
{
Console.WriteLine(" XH AppDomain Manager ");
XHHostSecurityManager = AppDomain.CurrentDomain.CreateInstanceAndUnwrap(
"XHSecurityManager, Version=1.0.0.3, Culture=neutral, " +
"PublicKeyToken=5659fc598c2a503e",
 "托管宿主.XHHostSecurityManager") as HostSecurityManager;
Console.WriteLine(" Custom Security Manager Created.");

}

public override HostSecurityManager  HostSecurityManager
{
get
{
return XHHostSecurityManager;
}
}
public override Assembly EntryAssembly
{
get
{
return base.EntryAssembly;
}
}
}
}

现在通过代码清单3-13创建的宿主应用程序能够参与新应用程序域的创建。在代码中声明了两个权限,重写了两个属性,在实际的编码中可以按照这样的简单模式进行扩展,真正地参与CLR的管理。

编写托管宿主之后,如何让它发挥作用呢?一般有三种选择:

(1)非托管API

关于非托管API在CLR寄宿一节进行了详细的介绍,但是在讨论CLR寄宿的时候只讨论了完全采用非托管API实现的非托管宿主实施的寄宿。那么想要通过非托管API来使托管宿主发挥作用的话,必须在非托管API启动CLR之后把控制权转交给我们的托管宿主。宿主在调用 CorBindToRuntimeEx之后,将请求指向 ICorRuntimeHost 的接口指针,利用该指针转向到托管宿主。

(2)环境变量

在 APPDOMAIN_MANAGER_ASM 和 APPDOMAIN_MANAGER_TYPE 环境变量中标识替代的 AppDomainManager 的程序集和类型。该程序集必须完全受信任,并且包含在起始应用程序的全局程序集缓存或目录中。环境变量中的类型和程序集名称必须是完全限定的。例如:

set APPDOMAIN_MANAGER_TYPE=MyNamespace.TestAppDomainManager
set APPDOMAIN_MANAGER_ASM=customappDomainmanager, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f1368f7b12a08d72

注意 只有被授予 FullTrust 的程序集(如全局程序集缓存中的程序集或者在 AppDomain.CreateDomain(String, Evidence, AppDomainSetup, PermissionSet, array<StrongName>[]()[]) 方法中标识为fullTrustAssemblies 的程序集)才可以在 AppDomainManager 构造函数和 InitializeNewDomain方法中加载。

(3)注册表值

在启动CLR之前,HKEY_LOCAL_MACHINE(or HKEY_CURRENT_USER)\Software\Microsoft\.NETFramework\键值必须设置两个值,一个是APPDOMAIN_MANAGER_ASM,另一个是APPDOMAIN_MANAGER_TYPE。APPDOMAIN_MANAGER_ASM必须是安装到全局程序集缓存的程序集,APPDOMAIN_MANAGER_TYPE是自定义的托管宿主的类。

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:3.3 高级宿主控制
下一篇:3.3.2 托管环境下的线程注入实例
相关文章
图文推荐
排行
热门
最新书评
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站