「託管宿主」指以托管代碼實作 AppDomainManager 衍生類別,接管 CLR 建立應用程式域的行為。比非託管宿主開發門檻低、除錯容易,是擴充 CLR 行為的推薦路徑。
[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; }
// 其他成員...
}
[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;
}
set APPDOMAIN_MANAGER_TYPE=MyNamespace.TestAppDomainManager set APPDOMAIN_MANAGER_ASM=CustomAppDomainManager, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f1368f7b12a08d72
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework APPDOMAIN_MANAGER_ASM = "CustomAppDomainManager, Version=1.0.0.0, ..." APPDOMAIN_MANAGER_TYPE = "MyNamespace.TestAppDomainManager"
CorBindToRuntimeEx 啟動 CLRICorRuntimeHost 介面指標AppDomainManager限制:只有在
AppDomainManager建構函式與InitializeNewDomain中載入的組件,必須被標記為fullTrustAssemblies或安裝在 GAC,否則會擲回SecurityException。
本文部分內容改編自《.NET 安全揭秘》
作者:玄魂
出處:https://www.cnblogs.com/xuanhun/