编写自定义 .NET Core 主机以从本机代码控制 .NET 运行时

释放双眼,带上耳机,听听看~!

    自定义 .Net Core 主机运行.Net Core代码,以及控制运行时运行状态,是在.Net Core 高级运行环境以及定制.Net Host ,CLR 等必不可少的。

    这些设置包括为

 

    1.设置启动标志

使用服务器GC( STARTUP_SERVER_GC),   

还是使用并发GC(STARTUP_CONCURRENT_GC),             

STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN 最大化域中性加载        

STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN_HOST 强名称程序集的域中立加载,

STARTUP_SINGLE_APPDOMAIN 所有代码都在默认的AppDomain中执行,

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);

 

简短几行代码就可以进行自托管(Java/.Net QQ 群:676817308)

给TA打赏
共{{data.count}}人
人已打赏
站长资讯

利用python计算多边形面积

2020-11-9 3:45:39

站长资讯

基于keepalived搭建MySQL热机集群

2020-11-9 3:45:41

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索