使用COM 風格的編程介面
假設不直接使用 COM 庫。不建立自己的封裝。那麼更可能的是使用 COM 風格的編程介面。這是由於如今很多開發商公布應用程式時。提供了首選的Interop 組件(Primary Interop Assemblies)。這是預先建立的 COM 封裝,因此,我們就不須要再自己考慮用 TlbImp.exe 來建立封裝了。
注意
很多其它有關首選的Interop 組件的內容。能夠在 MSDN 上找到。http://msdn.microsoft.com/en-us/library/aax7sdch.aspx 。
儘管首選的Interop 組件本質上就是 .NET 程式集,可是,通常有一些特殊的地方須要注意。比方:
某些數組和集合常常從 1 開始,而不是 0。
常常有一些方法,會有大量的可選參數;
很多屬性和方法會返回對象(object)類型,產生的結果對象須要強制轉換成真正的類型;
COM 類別包括非託管的資源。須要處理(dispose)。然而,這些類沒有實現標準的 .NET IDisposable 介面,因此。在 F# 的 use 綁定中就不能使用;只是。我們可以使用 F# 的對象運算式非常easy地就實現了 IDisposable。
F# 和 COM 進行互動與 C# 的關鍵不同在於,我們必須總是要建立對象的執行個體。而非介面。這聽趚有點奇怪,可是,在 COM 庫中,每個對象通常都有一個介面,有一個實現介面的類。在 C# 中,假設使用keyword new 嘗試建立 COM 介面的執行個體,的COM posablesable 編譯器會自己主動定向到(redirect)調用相應的類,而在 F#中就不是這樣。
與 Microsoft Office 互動可能是使用 COM 風格庫的最常見理由。
以下的清單是讀取 Excel 電子錶格的資訊。
open System
open Microsoft.Office.Interop.Excel
let main() =
// initalize an excel application
let app = new ApplicationClass()
// load a excel work book
let workBook =app.Workbooks.Open(@"Book1.xls",ReadOnly =true)
// ensure work book is closed corectly
use bookCloser ={ new IDisposable with
member x.Dispose() = workBook.Close() }
// open the first worksheet
let worksheet =workBook.Worksheets.[1] :?> _Worksheet
// get the A1 ceel and all surround cells
let a1Cell =worksheet.Range("A1")
let allCells =a1Cell.CurrentRegion
// load all cells into a list of lists
let matrix =
[ for row inallCells.Rows ->
let row = row:?> Range
[ for cell inrow.Columns ->
let cell = cell :?
> Range
cell.Value2] ]
// close the workbook
workBook.Close()
// print the matrix
printfn "%A" matrix
do main()
注意這個示範範例是怎樣處理我們前面提到的特殊地方的。我們實現了 IDisposable 並把它綁定到 bookCloser,保證即使在出錯的情況下也能關閉活頁簿。Open 方法有 15 個參數。可是。我們僅僅用了兩個:.Open(@"Book1.xls", ReadOnly = true)。第一個工作表的索引 1:workBook.Worksheets.[1];終於,每一行必須被強制轉換起來(upcast)能夠使用:let row = row :?> Range。