它可能只是遗漏了一些东西,但是,当我为Excel互操作编写一些代码时,它是如何进行的。
是否有需要部署/注册PIA的场景?或者我在这里做错了什么,因为在我看来,将PIA嵌入到主程序集中似乎不是一个很大的特性吗?
请原谅我的无知,如果有的话。
更新:
所以我做了一些测试,我编写了一个应用程序,打开excel,在一个单元格中添加"hello“并保存文件。
我在安装了Office2003的Win7开发机器上构建了它(所以我引用了2003年的libs)。有趣的是,没有嵌入式PIA的应用程序是9KB (3 PIA的总容量高达1.32MB)。使用嵌入式PIA的exe是13‘s。
其次,带有的 embedded PIA,该应用程序在一台带有Office 2007和2010的机器上工作。在WinXP+Office2007上,和没有嵌入式PIA,只有当WinXP+Office2007不在exe目录时才会失败。
所以我想无论用什么方法,都有某种动态分辨率?然后为什么它在没有Win7的情况下在exe目录中工作,但是在WinXP上却失败了(只有当PIA不在exe的dir中时),Win7框是否在全球范围内部署了PIA?
谢谢
吉迪恩
发布于 2010-12-10 17:03:12
实际上需要一个PIA并不是很常见。如果在一个公共类中公开Excel类型库中的任何互操作类型,则必须有一个。当其他代码使用您的类而不使用相同的互操作库时,这会出错。.NET中的类型只有来自同一个程序集时才是相同的。您将很难解释错误消息,比如“无法将应用程序转换为应用程序”。PIA确保每个人都使用相同的类型。只要每个人都使用相同的PIA版本,这本身就是一个难题。如果你能避免这种情况的话,把你自己的互操作DLL和你的应用一起部署是可以的。在大多数情况下,这并不困难。
这个问题在.NET 4.0中通过一个名为“类型等价”的特性得到了解决。它是特定于COM接口类型的,当它们具有相同的Guid和相同的声明时,CLR认为它们是兼容的,而不管哪个程序集包含它们。然后,利用‘embeds types’特性(与'no pia‘相同),编译器将互操作类型嵌入到程序集的元数据中。只有你实际使用的那些。
所以你不必再发布互操作库了,也不需要PIA了。而且它要小得多,因为你只为你实际使用的类型付费。强烈推荐,这是一笔不菲的钱。
发布于 2010-12-10 15:38:40
我自己并没有做什么,但我相信:
上的版本相同。
发布于 2010-12-10 16:04:21
了解NoPIA的关键之一是它没有将PIA嵌入到您的程序集中,而是只嵌入应用程序使用的PIA部分。它以非常细粒度的方式(一直到方法级别)这样做。其结果通常是大大减少了应用程序的部署规模。
https://stackoverflow.com/questions/4410414
复制相似问题