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

gid*_*eon 4 .net com-interop .net-4.0 pia office-interop

它可能我只是在这里遗漏了一些东西但是,当我为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?

谢谢
基甸

Han*_*ant 14

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

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

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


Jon*_*eet 5

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

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