.NET4新的NO PIA功能的优势是什么[部署PIA
-
08-10-2019 - |
题
它可能只是在这里缺少一些东西,但是当我为Excel Interop编写一些代码时,这就是它的发展。
- 我添加了对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)。带有嵌入式皮亚的exe是 13kb.
第二, 和 该应用程序嵌入了PIA,在与办公室的机器上工作 2007年和2010年。 和 没有 嵌入PIA,在WinxP+Office2007上,仅当PIA不在EXE目录中时,它才失败。
所以我想无论哪种方法都有某种动态分辨率?然后,为什么它在没有PIA的EXE目录中的Win7上起作用,但是在WinXP上,它失败了(只有Pia不在Exe的DIR中),Win7 Box是否有PIA在全球范围内部署的东西?
谢谢
基甸
解决方案
实际上需要PIA并不常见。如果您在其中一个公开课程中从Excel类型库中公开任何Interop类型,则必须有一个。当其他代码使用您的类并且不使用相同的Interop库时,这是错误的。一种.NET的类型仅在来自同一组件的情况下是相同的。您将很难解释错误消息,例如“无法将应用程序施加到应用程序”。 PIA确保每个人都使用相同的类型。只要每个人都使用相同的PIA版本,这本身就是一个困难的问题。如果您避免使用此功能,则可以与应用程序一起部署自己的Interop DLL。在大多数情况下,这并不困难。
该问题通过称为“类型等价”的功能在.NET 4.0中解决。它是特定于COM接口类型的,CLR认为它们具有相同的[GUID]和相同的声明,无论汇编包含什么,它们都会兼容。然后,使用“嵌入Interop类型”功能(与“ NO PIA”相同)利用这一点,编译器将Interop类型嵌入组件的元数据中。只有您实际使用的。
因此,您不必再运送Interop库,也不需要PIA。而且它要小得多,因为您只为实际使用的类型付费。那是一个 很多 强烈建议使用爆炸。
其他提示
我自己没有做太多互动,但我相信:
- 有时PIA可能很大。如果应用程序本身很小,PIA可以使它相形见war
- 关于版本的方法,无PIA方法更灵活:只要您仅使用COM对象版本提供的成员 实际上 提供,你很好...而我认为使用PIA方法,您需要将PIA用于与目标机上的com对象相同的版本
关于NOPIA的关键要点之一是,它不会将PIA嵌入您的组件中,而仅嵌入了您的应用程序使用的PIA部分。它以非常精细的粒度方式(一直到方法级别)来执行此操作。结果通常是应用程序的部署规模非常大大降低。