.NET組件的注冊表中RuntimeVersion的作用
使用過COM來訪問.NET組件的朋友們應該都會注意到在對應注冊表中有一個RuntimeVersion的鍵值:

這個RuntimeVersion的命名很容易讓人誤認為RuntimeVersion是用來指定該.NET組件所應該運行的CLR的版本號。實際上,這個鍵值的意思和字面上不是特別一致。如果我們考慮一個情況:首先,進程中先創建一個.NET類型的實例,RuntimeVersion標記為1.1,然后再創建一個.NET類型的實例,其RuntimeVersion標記為v2.0,那么到底會加載那些CLR版本呢?其實,在目前的.NET版本(Silverlight除外)中,因為無法支持在同一個進程中加載多個不同版本的CLR,因此無法支持真正的按照RuntimeVersion來加載不同的CLR版本。實際上,CLR總是加載***的CLR版本(嚴格來說其實是mscoree.dll來加載)。因此,在之前的情況下,如果機器上面安裝了1.1和2.0,實際上進程只加載了2.0的CLR,而沒有加載1.1。如果機器上面只有1.1的話,***個1.1的.NET組件會創建成功,并且啟動1.1的CLR,第二個2.0的.NET類型會創建失敗,并且返回REGDB_E_CLASSNOTREG (0x80040154)
總結一下:通過COM的CoCreateInstance創建.NET類型的實例的時候,CLR總是加載***的CLR版本,如果啟動成功,檢查該CLR版本是否大于或等于RuntimeVersion鍵值。如果是,成功,返回S_OK,否則失敗,返回REGDB_E_CLASSNOTREG。因此,如果在CoCreateInstance的時候發現返回REGDB_E_CLASSNOTREG,但是注冊表又沒有問題的話,不妨檢查一下RuntimeVersion。
順便說一句,在.NET 4.0中,我們正在著手去掉進程內無法加載多個不同版本CLR的限制,很有可能.NET組件中RuntimeVersion的行為也會作出相應改變,但是目前還有一些細節沒有敲定,等有了進一步消息我會盡快更新。
【編輯推薦】

















