有關CLR的初學小整理(可能理解不深刻,望大牛指出)

來源:互聯網
上載者:User

標籤:

1.

.Net程式通過CLR去載入運行管理代碼, 載入CLR的進程成為“宿主”,通常作業系統載入。 載入CLR的進程也可以為某個DLL,也成為“宿主”

2.

宿主介面使宿主能夠對運行庫的更多方面進行控制,從而能夠在 CLR 和宿主的執行模型之間進行更緊密的整合。在.NET Framework 1 版中,宿主模型使非託管宿主能夠將 CLR 載入到進程中、配置某些設定以及接收事件通知。但在通常情況下,宿主和 CLR 可以在該進程中獨立運行

3.

所有的CLR Hosting API提供的主要功能包括:CLR的啟動和關閉、App Domain相關、自訂錯誤處理、編程模型的執行、對調試器的支援、Assembly的Load相關、CLR的內部事件、CLR Engine相關、記憶體管理和記憶體回收、Threading、同步和I/O的支援等

4.

如果某一個特定的功能是由CLR來實現的,調用這個功能的相應的介面就用ICLR來開頭,如果這個功能是Host實現的,就調用IHost開頭的介面定義的函數

5.

此處所說的“介面”都是API,直接調用即可。類似調用Win32.API函數。

6.

MSCOREE.DLL負責選擇.NET版本、調用和初始化CLR等工作。非託管程式想要啟動CLR也必須引用MSCOREE.DLL,利用它的匯出函數載入Managed 程式碼和進行定製CLR等操作

7.

MSCOREE.DLL宿主介面

宿主介面使宿主能夠對運行庫的更多方面進行控制,從而能夠在 CLR 和宿主的執行模型之間進行更緊密的整合。在.NET Framework 1 版中,宿主模型使非託管宿主能夠將 CLR 載入到進程中、配置某些設定以及接收事件通知。但在通常情況下,宿主和 CLR 可以在該進程中獨立運行。通過 .NET Framework 2.0 版及更高版本中新的抽象層,宿主可以提供當前由 Win32 程式集中的類型提供的多種資源,並擴充了宿主可以配置的功能集。

MSCOREE.DLL同樣提供了多個宿主介面,這裡只介紹較為重要的幾個,更多的內容請讀者參考MSDN。

ICorRuntimeHost 介面

該介面是調用CLR要用到的第一個介面,它負責初始化工作。該介面由上面提到的CorBindToRuntimeEx函數返回.

EG:

ICLRRuntimeHost::Start 方法

將 CLR 初始化到進程中。

q  ICLRRuntimeHost::Stop 方法

使運行庫停止代碼的執行。

ICLRGCManager介面

該介面提供允許宿主與公用語言運行庫的記憶體回收系統進行互動的方法

ICLRGCManager介面的各方法說明如下:

q  ICLRGCManager::Collect方法

為指定的產生強制執行記憶體回收。

q  ICLRGCManager::GetStats方法

擷取有關記憶體回收系統的一組當前統計資訊。

q  ICLRGCManager::SetGCStartupLimits方法

設定記憶體回收段的大小和記憶體回收系統零代的最大大小

 

8.

所有的CLR Hosting API提供的主要功能包括:CLR的啟動和關閉、App Domain相關、自訂錯誤處理、編程模型的執行、對調試器的支援、Assembly的Load相關、CLR的內部事件、CLR Engine相關、記憶體管理和記憶體回收、Threading、同步和I/O的支援等

 

9.

載入CLR與執行代碼執行個體

下面展示一下如何採用一個非託管的宿主來載入CLR並且執行裡面的代碼。請看代碼清單1-11。

     代碼清單1-11  載入CLR與執行代碼執行個體

       //首先,在非託管宿主裡面載入CLR並且啟動 ICLRRuntimeHost *pCLRHost = NULL;

 

      HRESULT hr = CorBindToRuntimeEx(

 

      L"v2.0.40103",          //需要載入的CLR版本,Null表示最新的      L"wks",                  //GC的風格,Null表示預設的工作站模式      STARTUP_CONCURRENT_GC,

 

      CLSID_CLRRuntimeHost,               //CLR的CLSID

 

      IID_ICLRRuntimeHost,             //ICLRRuntimeHost的IID

 

      (PVOID*) &pCLRHost);                 //返回的COM介面

 

      // 初始化並且啟動CLR

 

       pCLRHost->Start();

 

 

//然後執行一段Managed 程式碼hr = pCLRHost ->ExecuteInDefaultAppDomain(L"test.exe",

 

                                        L" test.Program",

 

                                        L"Start",

 

                                        NULL,

 

                                        &retVal);

代碼清單1-11隻是一個最簡單的樣本,在實際應用中可以實施更多的配置,由於篇幅所限,本書就不更多地去講解相關內容了,可以明確的是,一切操作都不會脫離上述介面。

-----------------------註:本文部分內容改編自《.NET安全揭秘》

 

註:參考原文:

http://www.cnblogs.com/xuanhun/archive/2012/06/23/2559295.html

有關CLR的初學小整理(可能理解不深刻,望大牛指出)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.