首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

CLR 寄宿 (下):託管宿主 — 實作 AppDomainManager 自訂應用程式域行為

     編輯:關於.NET

「託管宿主」指以托管代碼實作 AppDomainManager 衍生類別,接管 CLR 建立應用程式域的行為。比非託管宿主開發門檻低、除錯容易,是擴充 CLR 行為的推薦路徑。

AppDomainManager 核心虛擬成員

[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure)]
[SecurityPermission(SecurityAction.InheritanceDemand, Flags = SecurityPermissionFlag.Infrastructure)]
public class AppDomainManager : MarshalByRefObject {
    public virtual void InitializeNewDomain(AppDomainSetup appDomainInfo);
    public virtual HostSecurityManager HostSecurityManager { get; }
    public virtual Assembly EntryAssembly { get; }
    // 其他成員...
}

自訂 XHAppDomainManager 範例

[Guid("F4D15099-3407-4A7E-A607-DEA440CF3891")]
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure)]
[SecurityPermission(SecurityAction.InheritanceDemand, Flags = SecurityPermissionFlag.Infrastructure)]
public class XHAppDomainManager : AppDomainManager {
    private HostSecurityManager xhSecurityManager;

    public override void InitializeNewDomain(AppDomainSetup appDomainInfo) {
        Console.WriteLine("XH AppDomain Manager 初始化");
        
        // 跨域建立自訂 HostSecurityManager 實例
        xhSecurityManager = 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 
        => xhSecurityManager;

    public override Assembly EntryAssembly 
        => base.EntryAssembly;
}

三種啟用託管宿主的方式

1. 環境變數 (最簡單)

set APPDOMAIN_MANAGER_TYPE=MyNamespace.TestAppDomainManager
set APPDOMAIN_MANAGER_ASM=CustomAppDomainManager, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f1368f7b12a08d72
  • 組件必須 **FullTrust** (GAC 或啟動目錄)
  • 型別名稱需完整限定

2. 登錄機碼 (機器級/用戶級)

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework
  APPDOMAIN_MANAGER_ASM = "CustomAppDomainManager, Version=1.0.0.0, ..."
  APPDOMAIN_MANAGER_TYPE = "MyNamespace.TestAppDomainManager"
  • 組件**必須安裝在 GAC**
  • 影響機器上所有 .NET 應用程式,需謹慎

3. 非託管 API 轉交控制權

  • 宿主呼叫 CorBindToRuntimeEx 啟動 CLR
  • 取得 ICorRuntimeHost 介面指標
  • 透過非託管介面將控制權轉給託管 AppDomainManager

限制:只有在 AppDomainManager 建構函式與 InitializeNewDomain 中載入的組件,必須被標記為 fullTrustAssemblies 或安裝在 GAC,否則會擲回 SecurityException。


本文部分內容改編自《.NET 安全揭秘》
作者:玄魂
出處:https://www.cnblogs.com/xuanhun/

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved