4

它可能只是在这里遗漏了一些东西,但是,当我为 Excel 互操作编写一些代码时,事情就是这样。

  • 我添加了对 Excel Com 库的引用。
  • VS 创建一个 PIA - Microsoft.Office.Interop.Excel ....(通过 tlbimp 对吗?)。
  • 我将 exe 和 interop(PIA) dll 复制到任何机器(使用 .net),它可以工作吗?

是否存在我必须部署/注册 PIA 的情况?或者我在这里有什么问题,因为在我看来将 PIA 嵌入到主程序集中似乎不是一个很棒的大功能?

请原谅我的无知,如果有的话。


更新:
所以我做了一些测试,我编写了一个打开 excel 的应用程序,在单元格中添加“hello”并保存文件。

我在安装了 Office 2003 的 Win7 Dev 机器上构建了它(所以我引用了 2003 库)。有趣的是,没有嵌入式 PIA 的应用程序是9KB(3 个 PIA 的总大小为 1.32MB)。使用嵌入式 PIA 的 exe 为13KB

其次,使用嵌入式 PIA,该应用程序可以在装有 Office 2007 和 2010的机器上运行。没有嵌入式 PIA,在 WinXP+Office2007 上,只有当 PIA 不在 exe 目录中时,它才会失败。

所以我猜无论哪种方法,都有某种动态分辨率?然后为什么它在 exe 目录中没有 PIA 的 Win7 上工作,但在 WinXP 上却失败了(仅当 PIA 不在 exe 的目录中时),Win7 盒子是否在全球范围内部署了 PIA 的 prolly ?

谢谢吉迪恩
_

4

3 回答 3

14

实际需要 PIA 并不常见。如果您在公共类之一中公开 Excel 类型库中的任何互操作类型,则必须拥有一个。当其他代码使用您的类并且不使用相同的互操作库时,这会出错。只有当它们来自同一个程序集时,.NET 中的类型才相同。您会收到难以解释的错误消息,例如“无法将应用程序转换为应用程序”。PIA 确保每个人都使用相同的类型。只要每个人都使用相同的PIA版本,这本身就是一个难题。如果可以避免这种情况,那么将您自己的互操作 DLL 与您的应用程序一起部署是可以的。在大多数情况下这并不难。

这个问题在 .NET 4.0 中通过称为“类型等效”的功能得到了解决。它特定于 COM 接口类型,当它们具有相同的 [Guid] 和相同的声明时,CLR 认为它们是兼容的,无论哪个程序集包含它们。然后通过“嵌入互操作类型”功能(与“无 pia”相同)利用这一点,编译器将互操作类型嵌入程序集的元数据中。只有你实际使用的那些。

因此,您不必再发布互操作库,也不需要 PIA。而且它要小得多,因为您只需为实际使用的类型付费。物超所值,强烈推荐

于 2010-12-10T17:03:12.470 回答
5

我自己没有做太多互操作,但我相信:

  • 有时 PIA 可能非常大。如果应用程序本身很小,PIA 可以使其相形见绌
  • no-PIA 方法在版本控制方面更加灵活:只要您只使用实际提供的 COM 对象版本提供的成员,就可以了……而我认为使用 PIA 方法,您需要将 PIA 用于与目标计算机上相同版本的 COM 对象
于 2010-12-10T15:38:40.120 回答
4

关于 NoPIA 要了解的关键事项之一是它不会将 PIA 嵌入到您的程序集中,而是仅嵌入您的应用程序使用的 PIA 部分。它以非常细粒度的方式(一直到方法级别)执行此操作。结果通常会显着减少应用程序的部署大小。

于 2010-12-10T16:04:21.443 回答