zoukankan      html  css  js  c++  java
  • 编写自定义 .NET Core 主机以从本机代码控制 .NET 运行时

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

  • 相关阅读:
    UILabel的使用
    CGAffineTransform的使用
    UIView的常用方法
    UICollectionViewController的用法1
    网址连接
    android developers blog
    Java并发编程:volatile关键字解析
    Android触摸屏事件派发机制详解与源码分析
    setScale,preScale 和 postScale 的区别
    android 内存
  • 原文地址:https://www.cnblogs.com/tangyanzhi1111/p/10524451.html
Copyright © 2011-2022 走看看