編寫自定義 .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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM