使用COM 风格的编程接口

假设不直接使用 COM 库。不创建自己的包装。那么更可能的是使用 COM 风格的编程接口。这是由于如今很多开发商公布应用程序时。提供了首选的互操作程序集(Primary Interop Assemblies)。这是预先创建的 COM 包装,因此,我们就不须要再自己考虑用 TlbImp.exe 来创建包装了。

注意

很多其它有关首选的互操作程序集的内容。能够在 MSDN 上找到。http://msdn.microsoft.com/en-us/library/aax7sdch.aspx 。

尽管首选的互操作程序集本质上就是 .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。



使用 COM 风格的编程接口的更多相关文章

  1. 网络层、传输层、应用层、端口通信协议编程接口 - http,socket,tcp/ip 网络传输与通讯知识总结

    引: http://coach.iteye.com/blog/2024511 什么是TCP和UDP,以及二者区别是什么? TCP的全称为传输控制协议.这种协议可以提供面向连接的.可靠的.点到点的通信. ...

  2. NetBIOS与Winsock编程接口

    最近在看网络编程方面的书,由于不是通信专业出身的,以前理解的网络体系感觉就是tcp/ip,最近工作上接触到了一些光环网等乱七八糟的东西,有些基本的LC.SC连接器都不认识.花时间看了下计算机网络体系结 ...

  3. 基于VC的ACM音频编程接口压缩Wave音频(一)

    (一)概述 音频数据一般都具有较高的采样率,经过压缩的原始数据才具有实用价值,否则不仅要占用大量存储空间而且在播放或进行网络传输时效率也是非常低下的,所以音频数字压缩编码在多媒体应用中有着广泛而又重要 ...

  4. Java链式编程接口

    在android开发中显示一个AlertDialog时,常采用下列的写法: new AlertDialog.Builder(getApplicationContext()) .setTitle(&qu ...

  5. (转载)Linux系统调用及用户编程接口(API)

    (转载)http://www.farsight.com.cn/news/emb167.htm 1 Linux系统调用 所谓系统调用是指操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组 ...

  6. USB联机线编程接口(API)

    USB联机线编程接口(API) 2013-10-19 本页面的文字允许在知识共享 署名-相同方式共享 3.0协议和GNU自由文档许可证下修改和再使用. 关键字:USB隔离线.USB点对点通讯.USB通 ...

  7. Windows数据库编程接口简介

    数据库是计算机中一种专门管理数据资源的系统,目前几乎所有软件都需要与数据库打交道(包括操作系统,比如Windows上的注册表其实也是一种数据库),有些软件更是以数据库为核心因此掌握数据库系统的使用方法 ...

  8. Java8内置的函数式编程接口应用场景和方式

    首先,我们先定义一个函数式编程接口 @FunctionalInterface public interface BooleanFunctionalInterface<T> { boolea ...

  9. Java8自定义函数式编程接口和便捷的引用类的构造器及方法

    什么是函数编程接口? 约束:抽象方法有且只有一个,即不能有多个抽象方法,在接口中覆写Object类中的public方法(如equal),不算是函数式接口的方法. 被@FunctionalInterfa ...

随机推荐

  1. ueditor使用注意事项

    1.js问题的介绍 第一ueditor型材 <script type="text/javascript" src="ueditor1_4_3-utf8-jsp/ue ...

  2. hdu 4912 Paths on the tree(树链拆分+贪婪)

    题目链接:hdu 4912 Paths on the tree 题目大意:给定一棵树,和若干个通道.要求尽量选出多的通道,而且两两通道不想交. 解题思路:用树链剖分求LCA,然后依据通道两端节点的LC ...

  3. php中国的垃圾问题

    header这条线加,这是解决中国乱码的问题. 版权声明:本文博主原创文章,博客,未经同意不得转载.

  4. LeetCode——Climbing Stairs

    You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...

  5. JSP_include指令和&lt;jsp:include&gt;

    包括三个文件:jsp_include.jsp, static.html, two.jsp 周边环境:tomcat7.0. myeclipse10 1.jsp_include.jsp <%@ pa ...

  6. Codeforces Round #107 (Div. 2)---A. Soft Drinking

    Soft Drinking time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  7. 如何在SSIS的脚本组件中访问变量

    原文:如何在SSIS的脚本组件中访问变量 这是一个小问题,我们在SSIS的设计中很多地方都会用到变量,我习惯性地将"变量"和"表达式"称为SSIS的灵魂,虽然不 ...

  8. Ajax跨域请求数据实例(JSOPN方式)

    今天在做取消申请的时候遇到了一个跨域ajax提交的问题. 情景是: 系统A是asp.net的站点,其中包括一个取消申请的接口(get方式通过参数提交到系统的某一个页面,然后返回提交成功或失败) 系统B ...

  9. 背包问题 (DP)

    利用记忆化数组.记dp[i][j]为根据rec的定义,从第i个物品开始挑选总重小于j时,总价值的最大值. 递推式: dp[i][j]=0     (j<w[i]) dp[i][j] dp[i][ ...

  10. HDU 4946 Area of Mushroom 凸包 第八次多校

    题目链接:hdu 4946 题意:一大神有N个学生,各个都是小神,大神有个二次元空间,每一个小神都有一个初始坐标,如今大神把这些空间分给徒弟们,规则是假设这个地方有一个人比谁都先到这,那么这个地方就是 ...