自定義 .Net Core 主機運行.Net Core代碼,以及控制運行時運行狀態,是在.Net Core 高級運行環境以及定制.Net Host ,CLR 等必不可少的。
這些設置包括為
1.設置啟動標志
STARTUP_SERVER_GC 使用服務器GC
GCSTARTUP_CONCURRENT_GC 還是使用並發
STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN 最大化域中性加載
STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN_HOST 強名稱程序集的域中立加載,
STARTUP_SINGLE_APPDOMAIN 所有代碼都在默認的AppDomain中執行,
2.以及設置AppDomain的運行方式
APPDOMAIN_FORCE_TRIVIAL_WAIT_OPERATIONS 在等待期間不要抽取信息,
APPDOMAIN_SECURITY_SANDBOXED 導致不從TPA列表中的程序集作為部分受信任加載,
APPDOMAIN_ENABLE_PLATFORM_SPECIFIC_APPS 啟用特定於平台的程序集,
APPDOMAIN_ENABLE_PINVOKE_AND_CLASSIC_COMINTEROP 允許從非TPA程序集進行PInvoking,
APPDOMAIN_DISABLE_TRANSPARENCY_ENFORCEMENT完全禁用透明度檢查。
3.主要步驟如下
(1).利用LoadLibrary 加載CoreClr.DLL獲取句柄
HMODULE ret = LoadLibraryExW(coreDllPath, NULL, 0);
(2).獲取DLL里面的GetCLRRuntimeHost函數,通過這個函數找到IID_ICLRRuntimeHost4接口(宿主接口)
ICLRRuntimeHost4* runtimeHost; FnGetCLRRuntimeHost pfnGetCLRRuntimeHost = (FnGetCLRRuntimeHost)::GetProcAddress(coreCLRModule, "GetCLRRuntimeHost"); if (!pfnGetCLRRuntimeHost) { printf("ERROR - GetCLRRuntimeHost not found"); return -1; } HRESULT hr = pfnGetCLRRuntimeHost(IID_ICLRRuntimeHost4, (IUnknown**)&runtimeHost);
(3).設置啟動標志
hr = runtimeHost->SetStartupFlags( static_cast<STARTUP_FLAGS>( STARTUP_FLAGS::STARTUP_CONCURRENT_GC | STARTUP_FLAGS::STARTUP_SINGLE_APPDOMAIN | STARTUP_FLAGS::STARTUP_LOADER_OPTIMIZATION_SINGLE_DOMAIN ) );
(4).啟動Host
hr = runtimeHost->Start();
(5).設置AppDomain
int appDomainFlags = APPDOMAIN_ENABLE_PLATFORM_SPECIFIC_APPS | APPDOMAIN_ENABLE_PINVOKE_AND_CLASSIC_COMINTEROP | APPDOMAIN_DISABLE_TRANSPARENCY_ENFORCEMENT;
(6).創建AppDomain
hr = runtimeHost->CreateAppDomainWithManager( L"Sample Host AppDomain", appDomainFlags, NULL,NULL, sizeof(propertyKeys) , propertyKeys, propertyValues, &domainId);
(7).運行托管代碼
DWORD exitCode = -1; hr = runtimeHost->ExecuteAssembly(domainId, targetApp, argc - 1, (LPCWSTR*)(argc > 1 ? &argv[1] : NULL), &exitCode);
(8).卸載內存
untimeHost->UnloadAppDomain(domainId, true /* Wait until unload complete */); runtimeHost->Stop(); runtimeHost->Release();
4.以上步驟都完成了,就可以開始Test Dom了
(1)寫個core控制台
using System; namespace ConsoleApp3 { class Program { static void Main(string[] args) { Console.WriteLine("tian xia feng yun chu wo bei"); Console.ReadLine(); } } }
(2)測試結果
簡短幾行代碼就可以進行自托管(Java/.Net QQ 群:676817308)