它可能只是在这里遗漏了一些东西但是,当我为Excel互操作编写一些代码时,它就是这样的。
是否存在我必须部署/注册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>
感谢
吉丁
答案 0 :(得分:14)
实际需要PIA并不常见。如果您在其中一个公共类中公开Excel类型库中的任何互操作类型,则必须有一个。当其他代码使用您的类并且不使用相同的互操作库时,这会出错。 .NET中的类型只有在来自同一程序集时才相同。您将收到一条难以解释的错误消息,例如“无法将应用程序强制转换为应用程序”。 PIA确保每个人都使用相同的类型。只要每个人都使用相同的PIA版本,这本身就是一个难题。如果可以避免这种情况,可以将您自己的互操作DLL与您的应用程序一起部署。在大多数情况下,这并不困难。
通过名为“类型等效”的功能在.NET 4.0中解决了这个问题。它特定于COM接口类型,CLR认为它们具有相同的[Guid]和相同的声明时是兼容的,无论哪个程序集包含它们。然后利用'embed interop types'功能(与'no pia'相同),编译器将interop类型嵌入到程序集的元数据中。只有你实际使用的那些。
因此您不必再运送互操作库,也不需要PIA。由于您只需支付实际使用的类型,因此它要小得多。强烈推荐,这是一个很棒的很多。
答案 1 :(得分:5)
我自己没有做太多的互操作,但我相信:
答案 2 :(得分:4)
了解NoPIA的一个关键事项是,它不会将PIA嵌入到您的程序集中,而是仅嵌入您的应用程序使用的PIA部分。它以非常精细的方式执行此操作(一直到方法级别)。结果通常是显着减少应用程序的部署大小。