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