使用 COM 风格的编程接口
使用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 风格的编程接口的更多相关文章
- 网络层、传输层、应用层、端口通信协议编程接口 - http,socket,tcp/ip 网络传输与通讯知识总结
引: http://coach.iteye.com/blog/2024511 什么是TCP和UDP,以及二者区别是什么? TCP的全称为传输控制协议.这种协议可以提供面向连接的.可靠的.点到点的通信. ...
- NetBIOS与Winsock编程接口
最近在看网络编程方面的书,由于不是通信专业出身的,以前理解的网络体系感觉就是tcp/ip,最近工作上接触到了一些光环网等乱七八糟的东西,有些基本的LC.SC连接器都不认识.花时间看了下计算机网络体系结 ...
- 基于VC的ACM音频编程接口压缩Wave音频(一)
(一)概述 音频数据一般都具有较高的采样率,经过压缩的原始数据才具有实用价值,否则不仅要占用大量存储空间而且在播放或进行网络传输时效率也是非常低下的,所以音频数字压缩编码在多媒体应用中有着广泛而又重要 ...
- Java链式编程接口
在android开发中显示一个AlertDialog时,常采用下列的写法: new AlertDialog.Builder(getApplicationContext()) .setTitle(&qu ...
- (转载)Linux系统调用及用户编程接口(API)
(转载)http://www.farsight.com.cn/news/emb167.htm 1 Linux系统调用 所谓系统调用是指操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组 ...
- USB联机线编程接口(API)
USB联机线编程接口(API) 2013-10-19 本页面的文字允许在知识共享 署名-相同方式共享 3.0协议和GNU自由文档许可证下修改和再使用. 关键字:USB隔离线.USB点对点通讯.USB通 ...
- Windows数据库编程接口简介
数据库是计算机中一种专门管理数据资源的系统,目前几乎所有软件都需要与数据库打交道(包括操作系统,比如Windows上的注册表其实也是一种数据库),有些软件更是以数据库为核心因此掌握数据库系统的使用方法 ...
- Java8内置的函数式编程接口应用场景和方式
首先,我们先定义一个函数式编程接口 @FunctionalInterface public interface BooleanFunctionalInterface<T> { boolea ...
- Java8自定义函数式编程接口和便捷的引用类的构造器及方法
什么是函数编程接口? 约束:抽象方法有且只有一个,即不能有多个抽象方法,在接口中覆写Object类中的public方法(如equal),不算是函数式接口的方法. 被@FunctionalInterfa ...
随机推荐
- HDU3988-Harry Potter and the Hide Story(数论-质因数分解)
Harry Potter and the Hide Story Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 ...
- 新版本NDK环境结构(避Cygwin,超快)
曾经做Android的项目要用到NDK就必需要下载NDK,下载安装Cygwin(模拟Linux环境用的),下载CDT(Eclipse C/C++开发插件),还要配置编译器,环境变量... 麻烦到不想说 ...
- Android采用canvas绘制各种图形
canvas通俗的说就是一个帆布,我们可以用刷子paint,就此随机抽签显卡. 原理: 能够canvas视Surface替代或接口.图形绘制Surface向上.Canvas封装了全部的绘制调用. 通过 ...
- Android:抄QQ照片选择器(按相册类别显示,加入选择题)
这个例子的目的是为了实现类似至QQ照片选择功能.选择照片后,,使用类似新浪微博 微博 页面上显示. 先上效果图: 本例中使用的主要技术: 1.使用ContentProvider读取SD卡全部图 ...
- ViewPager实现页面切换
先贴效果图(每个开关Tab债券.尾随页变化.效果图蓝条添加的用户体验) watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzIxMDYyMA==/fo ...
- 于XAML导入命名空间的代码
例如,下面的代码到指定的命名空间.不仅导入的命名空间,并且还为指定的命名空间前缀local.当然,你也可以指定一个前缀为另一个名称,这可以定义.导入后,市民可以在命名当前空间XAML使用代码.例如,在 ...
- NSIS脚本:更改壁纸
原文 NSIS脚本:更改壁纸 我们在制作主题安装包的时候,经常要进行自动更改壁纸的操作,其实用NSIS实现这一点非常简单.示例代码如下: 01 Name "更改壁纸" 02 Out ...
- TCP/IP 网络编程(六)
流程模型: 线程模型: 线程的创建和运行流程 #include <pthread.h> int pthread_create(pthread_t * restrict thread, co ...
- M、V、C
概述 Model-View-Controller(MVC),即模型-视图-控制器. MVC将软件系统分成三大部分:Model,View,Controller,三个部分通过某种机制通信 M.V.C的职能 ...
- 【MongoDB】Serveral common command of MongoDb
In the recent days, since the overwork made me exhaused, on arrival to home I will go to bed, which ...