C++手動載入CLR運行託管程式(CLR Hosting)

來源:互聯網
上載者:User

標籤:hosting   介紹   clr   運行   proc   全域   goto   tco   注意   

轉載自:http://www.linuxidc.com/Linux/2012-10/72293.htm機制介紹

有些時候主程式是通過C/C++實現的,但是我們希望通過Managed 程式碼來擴充非託管程式,從而也獲得Managed 程式碼帶來的一系列優點。比如開發效率高,自動記憶體回收等。

運行託管與Unmanaged 程式碼根本區別在於Managed 程式碼是進程首先載入CLR然後通過CLR運行託管程式,而Unmanaged 程式碼則是作業系統直接根據其PE Header載入程式分配記憶體從而運行。因此如果需要通過Managed 程式碼來擴充非託管程式,首先要載入CLR來使非託管程式獲得運行Managed 程式碼的能力。

可以使用以下過程將 CLR 載入到進程中:

  1. 調用 CLRCreateInstance 函數以擷取 ICLRMetaHost 或 ICLRMetaHostPolicy 介面。 CLRCreateInstance 函數取代 .NET Framework 1.1 和 2.0 承載全域靜態函數部分中列出的所有 CorBindTo* 函數。
  2. 調用 ICLRMetaHost::EnumerateInstalledRuntimes、ICLRMetaHost::GetRuntime 或 ICLRMetaHostPolicy::GetRequestedRuntime 方法以擷取有效 ICLRRuntimeInfo 指標。
  3. 調用 ICLRRuntimeInfo::GetInterface 方法。 為 rclsid 參數指定 CLSID_CLRRuntimeHost,並為 riid 參數指定 IID_ICLRRuntimeHost。

所有這些介面的原型均位於 Metahost.h 檔案中,該檔案位於 Windows 軟體開發套件 (SDK) 的 Include 目錄中。 宿主可以使用 ICLRRuntimeInfo 和 ICLRRuntimeHost 介面來控制要載入哪個版本的運行時以及準系統(如記憶體回收和程式集載入)的行為。使用 ICLRRuntimeHost 介面可以執行以下操作:

  1. 通過調用 ICLRRuntimeHost::Start 方法來啟動運行時。
  2. 執行Managed 程式碼。
  3. 擷取指向 ICLRControl 介面(可提供對由通用語言執行平台實現的管理器的訪問)的指標,以及註冊實現 IHostControl 介面的宿主控制項對象。 通用語言執行平台調用 IHostControl 介面來確定宿主實現的管理器。

參考這裡 http://msdn.microsoft.com/en-us/library/01918c6x.aspx

執行個體代碼

以下是C++載入CLR運行託管程式的執行個體代碼,啟動CLR之後通過調用ExecuteInDefaultAppDomain來運行託管程式SampleManagedApp.exe中名為Test的程式。這裡要注意的是ExecuteInDefaultAppDomain只能執行Managed 程式碼簽名為static int pwzMethodName (String pwzArgument)的方法。

  1. #include <SDKDDKVer.h>  
  2.  
  3. #include <stdio.h>  
  4. #include <tchar.h>  
  5. #include <windows.h>  
  6.  
  7. #include <metahost.h>  
  8. #include <mscoree.h>  
  9. #pragma comment(lib, "mscoree.lib")  
  10.  
  11. int _tmain(int argc, _TCHAR* argv[]) 
  12.     ICLRMetaHost        *pMetaHost = nullptr; 
  13.     ICLRMetaHostPolicy  *pMetaHostPolicy = nullptr; 
  14.     ICLRRuntimeHost     *pRuntimeHost = nullptr; 
  15.     ICLRRuntimeInfo     *pRuntimeInfo = nullptr; 
  16.  
  17.     HRESULT hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID*)&pMetaHost); 
  18.     hr = pMetaHost->GetRuntime(L"v4.0.30319", IID_PPV_ARGS(&pRuntimeInfo)); 
  19.  
  20.     if(FAILED(hr)) 
  21.     { 
  22.         goto cleanup; 
  23.     } 
  24.  
  25.     hr = pRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost, IID_PPV_ARGS(&pRuntimeHost)); 
  26.  
  27.     hr = pRuntimeHost->Start(); 
  28.  
  29.     DWORD dwRet = 0; 
  30.     hr = pRuntimeHost->ExecuteInDefaultAppDomain(L"SampleManagedApp.exe", 
  31.                                                  L"SampleManagedApp.Program",   
  32.                                                  L"Test", 
  33.                                                  L"Hello World!", 
  34.                                                  &dwRet); 
  35.  
  36.     hr = pRuntimeHost->Stop(); 
  37.  
  38. cleanup: 
  39.     if(pRuntimeInfo != nullptr) 
  40.     { 
  41.         pRuntimeInfo->Release(); 
  42.         pRuntimeInfo = nullptr; 
  43.     } 
  44.  
  45.     if(pRuntimeHost != nullptr) 
  46.     { 
  47.         pRuntimeHost->Release(); 
  48.         pRuntimeHost = nullptr; 
  49.     } 
  50.  
  51.     if(pMetaHost != nullptr) 
  52.     { 
  53.         pMetaHost->Release(); 
  54.         pMetaHost = nullptr; 
  55.     } 

相應的Managed 程式碼如下,

  1. using System; 
  2.  
  3. namespace SampleManagedApp 
  4.     class Program 
  5.     { 
  6.         static void Main(string[] args) 
  7.         { 
  8.         } 
  9.  
  10.         public static int Test(string s) 
  11.         { 
  12.             Console.WriteLine(s); 
  13.             return 0; 
  14.         } 
  15.     } 

最終將SampleManagedApp.exe與非託管程式放在同一個路徑下運行非託管程式,就會得到最終Console中輸出:Hello World!

C++手動載入CLR運行託管程式(CLR Hosting)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.