PDC 2008: Day 1, .Net Type System Advancements

October 28th, 2008

微軟打算在 .Net CLR 4.0 中改進它的型別系統 (type system)。這個改進的主要動機有兩個,一是現行的 .Net 程式若是用到了 interop assembly,在安裝的時候,這些 interop assembly 的體積通常要比你寫的程式大很多。比方說,在程式中用到了 Excel 2007 interop 的話,就必須加裝 6.7MB 的 Office 2007 PIA redist,除了安裝用的 package 變大之外,程式執行時浪費的 working set 也變多 (你總不會用到 interop assembly 中的每一樣功能吧?)。此外,對於 managed to managed assembly,目前的做法是進行非常嚴格的版本檢查,若版本不合就直接踢掉。這雖然解決了 DLL hell 的問題,但卻造成更多問題: multi-target complexity 以及 deployment complexity。

multi-target 這個問題被唾棄很久,連微軟自己的師程工也很不爽,因此 CLR 4.0 就推出兩個重大的改進: type embedding 與 type equivalance。Type embedding 主要是要處理 interop assembly 的問題。比如說,我們的程式中用到 Excel interop,新版的 C# compiler 在編譯時可以直接匯入該 interop assembly 的 meta data,而且會把沒有用到的 vtable slot 直接跳過,因此就不需要 interop assembly 也可以知道 native COM object 的 GUID 以及 vtable offset。在執行的時候,CLR 會偵測這個 assembly 是否 embed partial interop information,若是的話,它會改變具現化 COM object 的方式,用新的方法去找到對應的 factory 並具現化。

Type equivalence 則是改變 CLR 對待 interface casting 的方式,在 CLR 4.0 中,若兩個 interface 有相同的 guid,則 CLR 會將這兩個 interface 視為 castable。在執行時,若 vtable offset 和 function signature 也相同,就允許呼叫這個函數 (簡言之,CLR 不再計較 assembly version)。若是找不到該函數,或是 signature 不合,該物件仍會被具現化,但系統會扔出 System.MethodMissingException。

C++/C#, 技術文章, 會議相關 | Comments Jump to the top of this page

Comments are closed.

隨便寫寫大家隨便看看的不出名小格子

舊文索引

站內管理