它可能只是在这里缺少一些东西,但是当我为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部分。它以非常精细的粒度方式(一直到方法级别)来执行此操作。结果通常是应用程序的部署规模非常大大降低。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top