使用 COM 风格的编程接口
使用COM 風格的編程接口
?
假設不直接使用 COM 庫。不創(chuàng)建自己的包裝。那么更可能的是使用 COM 風格的編程接口。這是由于如今很多開發(fā)商公布應用程序時。提供了首選的互操作程序集(Primary Interop Assemblies)。這是預先創(chuàng)建的 COM 包裝,因此,我們就不須要再自己考慮用 TlbImp.exe 來創(chuàng)建包裝了。
?
注意
很多其它有關首選的互操作程序集的內容。能夠在 MSDN 上找到。http://msdn.microsoft.com/en-us/library/aax7sdch.aspx 。
?
?
盡管首選的互操作程序集本質上就是 .NET 程序集,可是,通常有一些特殊的地方須要注意。比方:
某些數(shù)組和集合常常從 1 開始,而不是 0。
常常有一些方法,會有大量的可選參數(shù);
很多屬性和方法會返回對象(object)類型,產生的結果對象須要強制轉換成真正的類型;
COM 類包括非托管的資源。須要處理(dispose)。然而,這些類沒有實現(xiàn)標準的 .NET IDisposable 接口,因此。在 F# 的 use 綁定中就不能使用;只是。我們可以使用 F# 的對象表達式非常easy地就實現(xiàn)了 IDisposable。
F# 和 COM 進行交互與 C# 的關鍵不同在于,我們必須總是要創(chuàng)建對象的實例。而非接口。這聽趚有點奇怪,可是,在 COM 庫中,每個對象通常都有一個接口,有一個實現(xiàn)接口的類。在 C# 中,假設使用keyword new 嘗試創(chuàng)建 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()
?
注意這個演示樣例是怎樣處理我們前面提到的特殊地方的。我們實現(xiàn)了 IDisposable 并把它綁定到 bookCloser,保證即使在出錯的情況下也能關閉工作簿。Open 方法有 15 個參數(shù)。可是。我們僅僅用了兩個:.Open(@"Book1.xls", ReadOnly = true)。第一個工作表的索引 1:workBook.Worksheets.[1];終于,每一行必須被強制轉換起來(upcast)能夠使用:let row = row :?> Range。
總結
以上是生活随笔為你收集整理的使用 COM 风格的编程接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 左倾堆
- 下一篇: IoC(Inversion of Con