CLR寄宿(下) 托管宿主

简介:

CLR寄宿()  托管宿主

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

代码清单1-1  AppDomainManager类定义

 [ComVisibleAttribute(true)]

 

[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure)]

 

[SecurityPermissionAttribute(SecurityAction.InheritanceDemand, Flags = SecurityPermissionFlag.Infrastructure)]

 

public classAppDomainManager : MarshalByRefObject

 

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

代码清单1-2自定义XHAppDomainManager

namespace 托管宿主

{

 

    [GuidAttribute("F4D15099-3407-4A7E-A607-DEA440CF3891")]

 

    [SecurityPermissionAttribute(SecurityAction.LinkDemand,

 

        Flags = SecurityPermissionFlag.Infrastructure)]

 

 [SecurityPermissionAttribute(SecurityAction.InheritanceDemand,         Flags =SecurityPermissionFlag.Infrastructure)]

 

    class XHAppDomainManager:AppDomainManager

 

    {

 

        private HostSecurityManagerXHHostSecurityManager = null;

 

        public override void InitializeNewDomain(AppDomainSetupappDomainInfo)

 

        {

 

            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 AssemblyEntryAssembly

 

        {

 

            get

 

            {

 

                return base.EntryAssembly;

 

            }

 

        }

 

    }

 

}

 

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

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

非托管API

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

环境变量

 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方法中加载。

注册表值

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

 --------------------------------注:本文部分内容改编自《.NET 安全揭秘》


本文转自悬魂博客园博客,原文链接:http://www.cnblogs.com/xuanhun/archive/2012/06/23/2559358.html,如需转载请自行联系原作者

相关文章
|
10月前
|
开发框架 缓存 自然语言处理
【深入理解CLR 三】生成、打包、部署和管理应用程序及类型(下)
【深入理解CLR 三】生成、打包、部署和管理应用程序及类型(下)
101 0
|
10月前
|
开发框架 自然语言处理 安全
【深入理解CLR 三】生成、打包、部署和管理应用程序及类型(上)
【深入理解CLR 三】生成、打包、部署和管理应用程序及类型(上)
64 0
|
C语言 Windows
C语言编程: windows下启动外部应用程序
C语言编程: windows下启动外部应用程序
272 0
|
Web App开发 JSON 测试技术
|
安全 Java .NET
[转]托管代码与非托管代码
什么是托管代码(managed code)?       托管代码是一microsoft的中间语言(IL),他主要的作用是在.NET   FRAMEWORK的公共语言运行库(CLR)执行代码前去编译源代码,也就是说托管代码充当着翻译的作用,源代码在运行时分为两个阶段:       1.源代码编译为托管代码,(所以源代码可以有很多种,如VB,C#,J#)       2.托管代码编译为microsoft的平台专用语言。
1185 0
宿主
什么是宿主     ASP.NET Core应用程序需要在宿主中执行.宿主必须实现IWebHost接口,这个接口暴露了功能和服务的集合,以及Start方法。宿主通常使用WebHostBuilder的实例进行创建,该实例构建并返回一个WebHost实例。
1208 0