自定义 .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_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)