目录

一、概念

二、应用

三、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)
{//打开appMicrosoft.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的“嵌入互操作类型”属性改为Falseobject 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();//关闭Wordapp.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、分布式事务等等。

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

通过C#Microsoft.Office.Interop.Word理解互操作性相关推荐

  1. 错误类型:“系统找不到 Microsoft.Office.Interop.Word(转)

    错误类型:"系统找不到 Microsoft.Office.Interop.Word" 编译出现错误: "Could not load file or assembly ' ...

  2. 关于.net Microsoft.Office.Interop.Word组建操作word的问题,如何控制word表格单元格内部段落的样式。...

    控制word表格单元格内部文字样式.我要将数据导出到word当中,对于word表格一个单元格中的一段文字,要设置不同的样式,比如第一行文字作为标题要居中,加粗,第二行为正常的正文. 代码如下 publ ...

  3. html与word字体大小转换,字体大小不一样,当html转换为Word使用Microsoft.Office.Interop.Word...

    我试图将html文件转换为MS word(docx)文件. 使用Microsoft.Office.Interop.Word我能够从HTML转换为Word,但字体大小不一样的文件的HTML和Word格式 ...

  4. Interop type 'Microsoft.Office.Interop.Word.ApplicationClass' cannot be embedded. Use the applicable

    错误信息: Interop type 'Microsoft.Office.Interop.Word.ApplicationClass' cannot be embedded. Use the appl ...

  5. Microsoft.Office.Interop.Word 创建word

    转载 https://www.cnblogs.com/chenbg2001/archive/2010/03/14/1685746.html Microsoft.Office.Interop.Word ...

  6. Asp.net Core使用Microsoft.Office.Interop.Word转换文档

    源代码网络上有很多,但是使用过程中发现问题还是有的,尤其是在文档属性配置不同的时候,出现的问题就是不能转换.在开发端没有问题,但在不同于开发端电脑的配置情况下,会出现意向不到的问题.此处对解决方案进行 ...

  7. 无法将为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型

    文章目录 1.错误原因 2. 解决方式 2.1 office多版本 2.1.1 删除多余版本 2.1.2 修复当前版本 2.1.3 其他操作(可选1) 2.1.4 其他操作(可选2) 2.2 wps卸 ...

  8. C# Microsoft.Office.Interop.Word设置Word页脚之添加当前页数

    用C#操作Word,电脑上原生的库为Microsoft.Office.Interop.Word,虽然有些慢,但也能用.操作word的另外一个库是Spire.Doc,但是商业的,破解版也不好搞,还是凑合 ...

  9. Microsoft.Office.Interop.Word引用- 无法嵌入互操作类型

    添加引用->COM->Microsoft Word 14.0 Object Library 程序调试的时候报错: 错误 4317 无法嵌入互操作类型"Microsoft.Offi ...

最新文章

  1. iOS 几种初始化的分析比较
  2. 大三下学期第四周总结
  3. 记录MySQL下所执行的所有命令
  4. MySQL日志分类及性能分析你应该知道的知识
  5. 三、案例:留言板 url.parse()
  6. 数字思维:改变世界的4个方程
  7. 上传excel腾讯云服务器,使用SpringBoot上传文件到腾讯云
  8. Java获取字符串信息
  9. Python递归的几个经典案例
  10. 【U8】出纳管理制单锁定
  11. 研磨设计模式--抽象工厂模式
  12. 融合不是冗余,全栈自研才有出路?特斯拉/Mobileye这样做
  13. 什么软件画er图方便_ER模型怎么画?必备入门级模型图绘制软件
  14. datavideo切换台说明书_GoPro结合洋铭切换台现场节目制作
  15. python vim插件_有哪些好用到爆的vim插件?
  16. 单片机攻略3——C51入门
  17. 循环链表解决约瑟夫问题
  18. RabbitMQ:Plugin configuration unchanged;解决RabbitMQ启动问题,Win10用户中文问题解决
  19. 【springcloud合集】04:新建Moudle——微服务提供者支付模块
  20. JAVA计算机毕业设计校园线上点餐系统Mybatis+源码+数据库+lw文档+系统+调试部署

热门文章

  1. 解决 Vue3.0 globalThis is note defined
  2. Web 框架的替代方案来了!
  3. RabbitMQ:使用Docker构建RabbitMQ高可用负载均衡集群
  4. android service拦截按键,android里面屏蔽home键/禁止Home键或者随你DIY
  5. NPDP知识推送-第七章产品生周期管理(1)
  6. 高斯-约当消元法(转)
  7. Air724UG 4G LTE 模块AT指令连接服务器
  8. WebService:跟孔浩学习(契约优先、Schema、WSDL、SOAP、用户管理小系统)
  9. Android中处理大图片时图片压缩
  10. Jetpack Compose for Desktop: 里程碑1发布