天天看點

COM互操作 - 在VB 腳本裡面使用.NET類型

請看下面這段VBS代碼:

Set obj = CreateObject("System.Collections.ArrayList")

obj.Add("this is a test")

obj.Add(1)

obj.Add(obj)

Msgbox obj(0)

Msgbox obj(1)

Msgbox obj(2).ToString()

代碼裡面試圖建立一個ArrayList的.NET對象,然後添加了幾個不同類型的對象在這個ArrayList裡面,最後顯示結果。為什麼我們可以在VBS裡面使用.NET裡面的内建類型呢?這是因為.NET安裝好了以後,在系統資料庫裡面将所有COM可見的類型都注冊過了,打開系統資料庫編輯器,你會看到SYSTEM_CLASS_ROOT下面有很多以System.開頭的progid,這些progid的CLSID的InprocServer都是mscoree.dll,也就是說在VB script腳本裡面的CreateObject對象調用時,COM庫通過mscoree.dll加載CLR,然後建立System.Collections.ArrayList對象并最終傳回給VB Script程式。

而Msgbox obj(1)也有玄機,要知道,在ArrayList裡面隻能儲存Object類型的資料,也就是說但是obj.Add(1)調用完畢以後,ArrayList第二個元素是一個object類型,那麼為什麼Msgbox obj(1)卻能夠正确顯示1呢?Object類型裡面有好幾個函數,例如Equals,GetHashCode,為什麼其他的函數不調用,而偏偏調用ToString函數呢?這是因為.NET将ToString函數的DISPID設定為零了,在COM裡面,DISPID為0的函數為預設的調用函數。

本文轉自 donjuan 部落格園部落格,原文連結:  http://www.cnblogs.com/killmyday/archive/2009/02/20/1394468.html ,如需轉載請自行聯系原作者

繼續閱讀