博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编写自定义 .NET Core 主机以从本机代码控制 .NET 运行时
阅读量:7029 次
发布时间:2019-06-28

本文共 2487 字,大约阅读时间需要 8 分钟。

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

转载于:https://juejin.im/post/5c8b42bef265da2d89637670

你可能感兴趣的文章
UVALive 6915 Leveling Ground 倍增RMQ
查看>>
Inside ARC — to see the code inserted by the compiler
查看>>
云中气象 有备而来
查看>>
4.dubbo-demo+简易监控中心安装+管理控制台安装
查看>>
读书笔记《集体智慧编程》Chapter 4 : Searching and Ranking
查看>>
jquery form 插件 分类: JavaScript ...
查看>>
php二维数组访问
查看>>
用Shell实现俄罗斯方块代码(Tetris.sh)
查看>>
[zz]Ubuntu Hadoop HDFS 配置
查看>>
上市后Avaya锣鼓全开,加速战略布局规划
查看>>
日调度5万亿次,腾讯云发布企业级微服务中间件TSF
查看>>
海外侨胞建言四川对外开放:加强内陆省份竞争力成关键
查看>>
2019款奥迪Q7上市 配置增加/69.98万元起售
查看>>
策划求婚、陪挑婚纱,新郎不是我,仍感谢你来过|在百度遇见你
查看>>
从零单排学Redis【铂金一】
查看>>
如何处理Express异常
查看>>
Cycle.js 状态管理模型
查看>>
[译]Effective Kotlin系列之考虑使用原始类型的数组优化性能(五)
查看>>
为什么我从 Google 辞职而为自己工作
查看>>
技术问答集锦(四)
查看>>