嵌入互操作类型(Embed Interop Types)

运用office编程调用Excel 的PIA时Microsoft.Office.Interop.Excel.dll时会产生如下问题:

1.提示错误:未能加载文件或程序集“Microsoft.Office.Interop.Excel.dll”

2.安装的Excel PIA版本和编译时使用PIA的版本不一致。

解决方案:

  通过 /link 选项,可以部署包含嵌入类型信息的应用程序。 这样,该应用程序无需引用运行时程序集,便可以使用运行时程序集中实现嵌入类型信息的类型。如果发布了各种版本的运行时程序集,则包含嵌入类型信息的应用程序可以使用各种版本,而不必重新编译。有关示例,请参见 演练:嵌入托管程序集中的类型(C# 和 Visual Basic)。使编译器允许正在编译的项目使用指定程序集中的 COM 类型信息。
  当涉及 COM 互操作时,使用 /link 选项尤为有用。 通过嵌入 COM 类型,您的应用程序不再要求目标计算机上有主互操作程序集 (PIA)。/link 选项指示编译器:将所引用互操作程序集中的 COM 类型信息嵌入生成的编译代码中。 该 COM类型由 CLSID (GUID) 值标识。这样,您的应用程序可以在安装有 CLSID 值相同的相同 COM 类型的目标计算机上运行。自动执行 Microsoft Office 的应用程序就是很好的示例。由于 Office 这样的应用程序通常在不同的版本中采用相同的 CLSID 值,因此只要目标计算机上安装有 .NET Framework 4 或更高版本,且您应用程序使用的方法、属性或事件包含在所引用 COM 类型中,您的应用程序就可以使用引用的 COM 类型。
  /link 选项仅嵌入接口、结构和委托。 不支持嵌入 COM 类。

  若要在 Visual Studio 中设置 /link 选项,请添加程序集引用,并将 Embed Interop Types 属性设置为 true。Embed Interop Types 属性的默认设置为 false。

  在代码中创建嵌入 COM 类型的实例时,必须使用适当的接口来创建该实例。如果尝试使用 CoClass 创建嵌入COM 类型的实例,将导致错误。

——/link(C# 编译器选项)

  在引用 COM 对象的应用程序中嵌入类型信息,则可以不需要主互操作程序集 (PIA)。此外,利用嵌入的类型信息可实现应用程序的版本中立性。即,可以将程序编写为使用多个 COM 库版本中的多个类型,而不是每个版本都需要一个特定的 PIA。对于使用 Microsoft Office 库中对象的应用程序,这是一种常用方案。嵌入类型信息后,程序的同一个生成可以使用不同计算机上的不同 Microsoft Office 版本,而无需为 Microsoft Office 的每个版本重新部署该程序或 PIA。

  由于嵌入的互操作类型信息,本演练中创建的应用程序将以不同的 Microsoft Office 版本运行。如果 Embed Interop Types 属性设置为 False,则必须为应用程序以后运行时使用的每个 Microsoft Office 版本包括一个PIA。

——演练:嵌入 Microsoft Office 程序集中的类型信息(C#和 Visual Basic)

——如何:通过使用 Visual C# 2010 功能访问 Office 互操作对象(C# 编程指南)

dynamic编程的知识需要进一步了解。

关于ODBC数据源和Office互操作的问题解决方案:

1.ODBC数据源
  AccessDatabaseEngine.exe是Office2007 Access的ODBC数据库驱动程序。
  如果系统安装的是Office2003(Version 11.0),一般会提供了OLEDB8.0(Jet4.0)驱动程序支持(*.xls)读取,此时不会支持OLEDB12.0格式数据(*.xlsx)的读取,请安装AccessDatabaseEngine.exe,之后将支持两种格式。
2.系统安装了Office2007(Version 12.0)会提供了OLEDB8.0和12.0的数据库驱动程序,可通过Windows\System32\odbcad32.exe(或者64bit OS路径Windows\SysWow64\odbcad32.exe)查看。
  安装了Office2010(Version 14.0)会提供8.0、12.0和14.0的数据库驱动程序。
  程序编译为x86项目,所以安装32位的Office驱动程序。
2.Office互操作(Microsoft.Office.Interop.Excel.dll)
  添加.net引用dll,将“嵌入式互操作”设置为true。这样对安装部署的机器没有Office版本限制。(原理如上)

[C#]嵌入互操作类型的更多相关文章

  1. VS2013中, 无法嵌入互操作类型“……”,请改用适用的接口的解决方法

    使用VS2013,在引用COM组件的时候,出现了无法嵌入互操作类型“……”,请改用适用的接口的错误提示. 查阅资料,找到解决方案,记录如下: 选中项目中引入的dll,鼠标右键,选择属性,把“嵌入互操作 ...

  2. VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法(转自网络)

    最近开始使用VS2010,在引用COM组件的时候,出现了无法嵌入互操作类型“……”,请改用适用的接口的错误提示.查阅资料,找到解决方案,记录如下: 选中项目中引入的dll,鼠标右键,选择属性,把“嵌入 ...

  3. Microsoft.Office.Interop.Excel 程序集引用 ,Microsoft.Office.Interop.Excel.ApplicationClass 无法嵌入互操作类型

    using Microsoft.Office.Interop.Excel   添加程序集引用 方法:在引用--程序集--扩展中,添加引用Microsoft.Office.Interop.Excel,此 ...

  4. ArcEngine 无法嵌入互操作类型

    说明: 在.net 4.0中,声明 IPoint point = new PointClass();会出现下面这个错误 错误 2 类型"ESRI.ArcGIS.Geometry.PointC ...

  5. 无法嵌入互操作类型“ESRI.ArcGIS.Carto.RectangleElementClass”。请改用适用的接口。

    右键点击应用的程序集 ESRI.ArcGIS.Controls,修改"嵌入互操作类型"的值即可

  6. 无法嵌入互操作类型“Microsoft.Office.Interop.Excel.ApplicationClass”。请改用适用的接口

    解决 把Microsoft.Office.Interop.Excel.DLL的嵌入互操作类型改为ture就可以了

  7. ArcEngine10.1二次开发错误: 无法嵌入互操作类型,请改用适用的接口

    在之前配置ArcEngine.VS2010二次开发程序的时候,遇见"无法嵌入互操作类型,请改用适用的接口"的错误,在网上查了下,下面引用解决方法. 解决方式为在提示错误的引用上面右 ...

  8. C#引用COM对象,报错:《类型 *** 未定义构造函数, 无法嵌入互操作类型 *** 。请改用适用的接口》的解决办法。

    错误信息: 1.类型“SQLDMO.BackupClass”未定义构造函数 2.无法嵌入互操作类型“SQLDMO.BackupClass”.请改用适用的接口. 代码如下:                ...

  9. C#引用Office.word出错的解决办法-无法嵌入互操作类型“Microsoft.Office.Interop.Word.ApplicationClass” 【转】

    本文章转自 suchso 1.系统找不到 Microsoft.Office.Interop.Word" "Could not load file or assembly 'Micr ...

  10. [开发笔记]-“在引用COM组件时,出现了无法嵌入互操作类型。。。”的错误

    这两天在做一个需要将wps文档转换成word文档的程序,在调用wps的com组件时项目编译是没有问题的,但当运行的时候却弹出了下面的错误提示: 从网上百度一番后,找到了正确的解决方法. 先从Com组件 ...

随机推荐

  1. Unity-Animator(Mecanim)深入系列总索引

    花了不少时间完成了这篇Unity Animator学习系列文章,其中大多数内容都来自个人实践,包括API部分很多都是亲测,期望和网上的诸多教程达到互补. 相关参考文档 Unity Animator官方 ...

  2. CreateEvent和SetEvent及WaitForSingleObject的使用方法

    CreateEvent: 1.函数功能: 创建一个命名或匿名的事件对象 2.函数原型: HANDLE CreateEvent(   LPSECURITY_ATTRIBUTES lpEventAttri ...

  3. Python 流程控制:while

    while 语法如下,当条件为假时循环才退出,否则会一直循环下去: while 条件: 执行语句 当条件为假时,才会执行else语句: while 条件: 执行语句 else: 执行语句

  4. m2014-architecture-webserver->百万记录级mysql数据库及Discuz!论坛优化

    作者:shunz,出处:http://shunz.net/2008/06/mysql_discuz_.html 最近,帮一个朋友优化一个拥有20万主题,100万帖子,3万多会员,平均在线人数2000人 ...

  5. linux系统socket通信编程详解函数

    linux socket编程之TCP与UDP   TCP与UDP区别 TCP---传输控制协议,提供的是面向连接.可靠的字节流服务.当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之 ...

  6. MyEclipse 2016 CI修改web项目context-root

    右击项目properties——>搜索Deployment Assembly,修改如红框所示的Web Context Root

  7. PHP之Smarty模板引擎

    前面的话 对PHP来说,有很多模板引擎可供选择,但Smarty是一个使用PHP编写出来的,是业界最著名.功能最强大的一种PHP模板引擎.Smarty像PHP一样拥有丰富的函数库,从统计字数到自动缩进. ...

  8. poj_1475 BFS+BFS

    题目大意 推箱子游戏的基本玩法,求将箱子推到目的地的推动次数最少(并不是人移动总次数)的人移动路径. 题目分析 求最短路径的搜索问题,使用BFS.注意题目求的是 推动次数最少,因此将箱子移动作为状态, ...

  9. 微信小游戏 查看egret的小游戏支持库版本

    在开发者工具 console输入egret.wxgame

  10. 【BZOJ4372】烁烁的游戏 动态树分治+线段树

    [BZOJ4372]烁烁的游戏 Description 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠.题意:给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠.烁烁他每次会跳到一个节点u,把周围与他距 ...