通过C#Microsoft.Office.Interop.Word理解互操作性

25 篇文章 0 订阅
12 篇文章 3 订阅

目录

一、概念

二、应用

三、Word操作示例

四、总结

五、拓展


一、概念

C# 中的互操作性指的是C#托管代码非托管代码之间实现互操作性的方法。(参考微软文档:互操作性概述

参考:百度百科——互操作互操作性开放系统互连

二、应用

C#中的互操作性实现主要体现在以下几个方面:

①平台调用

实现:对DLL动态链接库(非托管代码,导出了函数的DLL)的调用

显示平台调用的图表。

参考:使用非托管 DLL 函数

②C++ 互操作

实现:使用 C++ interop(又称为 It Just Works (IJW))包装本机 C++ 类,可以包装本机 DLL (导出了函数的DLL)或 COM 组件,并使用 /clr 编译器开关生成托管程序集,以便生成 C++ 代码(DLL,导出类)

目的:使托管和非托管代码放置在同一个应用程序(甚至同一个文件),以便用 C# 或其他 .NET 语言编写的代码可以使用此类。

实现:在项目的引用管理器中添加对该DLL引用(可添加程序集、COM、项目、共享项目、浏览

注:C++项目中的引用管理可能无“浏览”选项

③向 C# 公开 COM 组件

前提:COM是一种软件开发技术(类比面向对象编程方法),是开发软件组件的一种方法。组件实际上是一些小的二进制可执行程序,它们可以给应用程序,操作系统(不局限于Windows系统)以及其他组件提供服务。开发自定义的COM组件就如同开发动态的,面向对象的API。多个COM对象可以连接起来形成应用程序或组件系统。并且组件可以在运行时刻,在不被重新链接或编译应用程序的情况下被卸下或替换掉。Microsoft的许多技术,如ActiveX, DirectX以及OLE等都是基于COM而建立起来的。

COM,即组件对象模型,是关于如何建立组件以及如何通过组件建立应用程序的一个规范,说明了如何可动态交替更新组件。COM组件属于非托管代码。

组件的例子如下:

参考:向 .NET Framework 公开 COM 组件

④向 COM 公开 C#

参考:向 COM 公开 .NET Framework 组件COM 类示例

三、Word操作示例

1.添加接口程序集并新建对象

新建控制台程序,点击添加引用——COM——类型库——Microsoft Word XX.0 Object Library(其互操作性“Embed Interop Types”属性默认为True,会自动添加另外的依赖COM组件Microsoft Office Core),之后添加新建一个WordApp对象

using WordApp = Microsoft.Office.Interop.Word;
namespace COM_Assemblies_Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
            //Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.ApplicationClass();//需要将Microsoft.Office.Interop.Word的“嵌入互操作类型”属性改为False
        }
    }
}


注(坑一):

①此处需要注意的是,若点击添加引用后添加的是程序集——扩展中的Microsoft.Office.Interop.Word,仍需手动添加对应版本的“office”程序集(其互操作性“Embed Interop Types”属性默认为False,与直接添加COM不同)

②若要使得使用程序的客户机生成word报告功能不受word版本(Word2007对应12.0,2010对应14.0,Word2013对应15.0)影响,需要将添加引用后(不管是通过COM还是程序集添加,word的互操作接口名称都一样)的Microsoft.Office.Interop.Word的互操作性“Embed Interop Types”属性设置为True

③参考:Word嵌入互操作类型

2.对word文件进行操作并退出

static void Main(string[] args)
{
    //打开app
    Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
    //Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.ApplicationClass();//需要将Microsoft.Office.Interop.Word的“嵌入互操作类型”属性改为False
    object path = "D://test.doc";
    if (File.Exists(path.ToString()))
    {
        File.Delete(path.ToString());
    }
    object nothing = System.Reflection.Missing.Value;
    //新建空白页
    Microsoft.Office.Interop.Word.Document doc = app.Documents.Add(ref nothing, ref nothing, ref nothing, ref nothing);
    //写入内容
    doc.Content.InsertAfter("This is debug text!");
    //保存文档
    doc.SaveAs2(path, ref nothing, ref nothing, ref nothing,
        ref nothing, ref nothing, ref nothing, ref nothing,
        ref nothing, ref nothing, ref nothing, ref nothing);
    //关闭文档
    doc.Close();
    //关闭Word
    app.Quit();
}

注(坑二):

①客户机上Office软件或Word安装时,Word的软件的“.NET编程支持”(会默认安装,不排除认为不进行安装的可能性);可以手动对其进行修改,会发现“全局程序集缓存GAC”目录“C:\Windows\assembly”下Microsoft.Office.Interop.Word对应版本的程序集,在修改“.NET编程支持”为不支持时会被移除,此时的结果就是VS项目中程序集下找不到该扩展,添加的COM亦不能正常工作。

②一些所谓的绿色版office可能也会存在此问题。

注(坑三):

①最近遇到的一个问题:客户机(华为)上最开始安装office365(未激活),后续又卸载并安装了“华为内部软件商店”上的office2013(博主在开发软件时引用的是Word2010的程序集,截止写此文时已了解设置互嵌入互操作为True则可无视客户机Word版本),客户报出说软件之前可以正常生成报告,而安装office2013后就不能生成了。

②首先是查看Word注册表并清理之前卸载遗留(参考:如何在 Word 中重置用户选项和注册表设置),并确认MSWORD.OLB库文件(路径:C:\Program Files\Microsoft Office\OfficeXX\MSWORD.OLB,参考博客:MSWORD.OLB未正确注册),最后如上文的一小段代码中的文本内容可以被编辑进debug.doc文档中,但博主的软件程序仍不能运行

③最后发现,是由于客户安装的内部office,其空白页的默认模板是被修改过的(正常我们新建空白页中页眉页脚都无特殊内容,而其新建空白页是有插入其Logo和其他描述信息的),最简单的方法:进入word选项——从默认模板管理器中点击打开文件,将下图左右红框中引用的文件删除或移动至其他文件夹,使word重新创建默认的真正对应空白页的Normal.dotm文件(最终结果如下图)。

参考的模板路径为:

“C:\Users\用户\AppData\Roaming\Microsoft\Templates”

“C:\Users\用户\AppData\Local\Packages\Microsoft.Office.Desktop_8wekyb3d8bbwe\LocalCache\Roaming\Microsoft\Templates”

四、总结

在软件中要实现生成报告功能,可以使用微软官方的word互操作程序集,亦可使用其他第三方dll。笔者对于前者的功能使用上也仅停留在从文档开头按顺序将需要的内容写到结尾(涉及页眉、页脚、图片、表格、格式、段落排版等),对于后者使用起来不需要客户端安装word即可完成doc、docx等格式报告的生成(之前遇到的坑是在使用DocX.dll时,如果将此报告直接使用WPS软件打开会造成排版异常,而在使用office的word打开再用WPS打开则排版正常,可能是代码尚未完善)。又因为笔者基本做的软件都是针对客户端,所以使用两者用来生成word报告都可以,若是在服务器后台进行报告生成而又不不愿意进行office安装的话,第三方dll亦是不错的选择。

最后,对于互操作,它是两个或以上具有互联能力的开放系统(至少被操作方要具有互操作性),在同等层次上(OSI七层模型)进行通信以交换数据,最终达到协同完成某项工作的目的

五、拓展

其他与互操作性有关的相关名词:COM+、RPC、中间件、分布式处理(系统)、CORBA、分布式事务等等。

理解一个概念的同时,往往会衍生出其紧密相关的其他概念,这是我们知识能力在储备积累的过程,也是发散学习的过程,不积跬步无以至千里,加油!

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值