.net4新的无pia功能的优势[部署PIA]

时间:2010-12-10 15:33:07

标签: .net .net-4.0 com-interop office-interop pia

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

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

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

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


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

我在安装了Office 2003的Win7 Dev机器上构建它(所以我引用了2003 libs)。有趣的是,如果没有嵌入式PIA,该应用程序 9KB (3 PIA总计高达1.32MB)。使用嵌入式PIA,exe < 13KB

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

所以我想无论采用哪种方法,都有某种动态分辨率?然后为什么它在没有PIA的exe7目录中的Win7上运行,但是在WinXP上它失败了(只有当PIA不在exe的目录中时),Win7盒子是否已经全局部署了PIA?或者什么? p>

感谢
吉丁

3 个答案:

答案 0 :(得分:14)

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

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

因此您不必再运送互操作库,也不需要PIA。由于您只需支付实际使用的类型,因此它要小得多。强烈推荐,这是一个很棒的很多

答案 1 :(得分:5)

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

  • 有时候PIA会很大;如果应用程序本身非常小,PIA可能会相形见绌
  • 关于版本控制,no-PIA方法更灵活:只要你只使用实际提供的COM对象版本提供的成员,你就可以了。 。我认为使用PIA方法,您需要将PIA用于与目标计算机上相同版本的COM对象

答案 2 :(得分:4)

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