Office 文件操作权威指南03

3.3 使用之前
如果已经安装了组件,引用也没有问题,如果建的是 WinForms 项目,在使用组件前首先得引用空间名,然后写一个私有方法 UseOffice() 的方法,试着练习使用他
这里写图片描述

当开始 new 一个实例时,马上就陷入问题,二义性名称问题这是怎么回事呢?这是考验你C#语言基础的时候了,之所以产生这个问题,是因为在三个名称空间下都有这个 ApplicationClass 类,自动补全提示会有一错误提示,不知道你使用的哪一个空间下的同名类。解决方法有两种,一种是写完整的类限定名,另一个是使用 using 语句的另一种用法
这里写图片描述

1.使用完整类限定名
这里写图片描述

2.使用 using 语句的另一种用法
这里写图片描述

第2种方法的意思就是把某一个类映射到一个自己起的一个名字的类,像 int 关键字实际上就是使用 using int=System.Int32;的方式映射,所以我们就不用写In32 类,直接用关键字 int 表示 Int32类,再看下面的截图,new 了一个 int 实例
这里写图片描述
到目前为此,发现一些地方还有错误波浪线,当生成时提示错误:无法嵌入互操用类型…。请改用接口,这又是为什么呢,为了操作 office 就那么难?
原因在于这个组件不同于NPOI, DocX, EEPlus 组件,后者都是正常的 .net 库 dll 组件,有什么公共类可以实例化的就直接 new ,但与前者 Word 这套组件不同,他是 VS 提供的一个互操作 com 组件的一个方便功能,叫做可调用包装,你不用理解他,你只要知道这是 VC++ 生成的 com 组件,并在 C# 下使用他而存在的,com 也不用理解他,因为光理解这2项内容就是一整本书的内容,可能还不够。
这里写图片描述

那么解决和使用他的方式就是 new 一个接口实例,根据 C# 接口知识,接口是不能直接实例化的,但可以做为变量,没错,这里就是违反了而可以 new 接口实例,如下图
这里写图片描述

事实上这是一个编译器功能,并不是 new 一个接口实例,.net 运行时也不允许 new 接口实例,在后台,他会根据 com dll 再生成一个新的 dll 放到 obj\Debug 文件夹下,名字为 Interop.*.dll, 这个dll 是真正的 .net 类库文件,并和你的项目文件一起合并生成。在这里,这个office dll 就已经是包装库了,直接与项目生成,如果你去找安装好的 office 下的这些文件,是真正的 com ,需要包装一次,再合并生成,这些工作 VS 自动完成。然后在 new 实例的时候他会反射这个内嵌的 dll 程序集加载一次,之后就不用再加载了,可以任意 new 多个对象也不用再加载。

到这里,仍然没有解理为什么可以 new 接口,这需要查看 Application 接口的特性才知道,当给接口添加了
[CoClass(typeof(ApplicationClass
特性之后,就告诉编译器这个接口可以写代码方式 new 接口还有就是为什么不能通过编程方式 new ApplicationClass 类,却要在运行时 new ApplicationClass 类,就因为 ApplicationClass 类的有ClassInterface 特性的原因
这里写图片描述
这里写图片描述

Application 接口和 ApplicationClass 类是相互作用,Application 接口由 ApplicationClass 类实现,却不能 new ApplicationClass 类,反而要 new Application 接口,这又算什么道理?原因在于 com 的一些东西需要运行时才能用,当然这个解释不够充分,这是因为我没有深入了解这里的机制和原理,并且已经超出了这篇帖子的范围,不必再追究。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值