我能使用 Microsoft.Office.Interop 程序集来操作 Office 2013 吗?

52

我需要将一个老的.NET 2项目导入到Visual Studio 2013中,并使用Microsoft Primary Interop Assemblies。

Visual Studio提示我需要向项目添加引用。我查阅了一些资料,发现微软只为Office 2010发布了PIA?(我的Office是2013)

现在我想知道:

  1. 我能否将其与Office 2013配合使用并实现向后兼容?
  2. 如果可以,这是否是未来走的好路线?它将保持兼容性吗?因为我看到需要使用最新的.NET 2,而Windows 8默认安装的.NET版本是4.5而不是3,大多数新电脑都会安装Office 2012或2013。

我遇到了同样的问题,并从以下网址获得了解决方案:http://www.microsoftsupportchat.com/blog/post/Microsoft-Office-2013-Primary-Interop-Assemblies-PIA/ - user3551882
5个回答

130

PIAs是历史文物,只有旧的.NET版本(v4之前)才需要。它们已经被“嵌入互操作类型”功能完美地替代,也称为“无需PIA”功能。自Visual Studio 2010以来得到支持,当您选择引用程序集时,可以在属性窗口中找到它。它默认为True。涵盖基础技术的优秀视频在此处提供。

这就是微软不发布Office 2013的PIAs的原因,他们希望您嵌入互操作类型。

这个功能非常理想,它避免了客户在其机器上安装PIAs和您将它们包含在安装程序中。解决问题,当两者都没有考虑到它时,这是一个非常普遍的错误。此外,Office的PIAs非常大,嵌入互操作类型的巨大优势在于您的程序集仅包含您实际使用的类型。从几兆字节减少到几千字节。

工作流程略有不同。现在您需要使用COM选项卡,而不是Add Reference对话框中的.NET Framework选项卡,添加引用到Microsoft.Office.Interop程序集。然后选择,比如,“Microsoft Excel 15.0 Object Library”来为使用Excel的程序生成互操作类型。如果您加载以前使用过PIAs的旧项目,则只需从COM选项卡中删除那些引用程序集,并重新添加它们。

请注意,有一种功能会丢失,有意针对你的开发机器上实际未安装的旧版Office版本更加困难。如果这是一个要求,那么仍然需要该版本的PIAs,强制在属性窗口中将“嵌入互操作类型”设置为True。但实际上这样做是值得怀疑的,微软很难保持新版本的Office与旧版本完全兼容。他们已经坚持了15年,但已经失去了活力。最坏的情况是目标比你的机器上安装的版本更新,这可能会导致你的程序崩溃,并出现非常难以诊断的异常,如AccessViolationException。
请注意,您必须对代码进行小的修改,以使其正常工作。合成的“XxxxClass”类未被嵌入,只有“Xxxx”接口被嵌入。只需从new语句中删除“Class”即可。

嘿...我正在创建MS Word报告。我应该使用OpenXML格式来适用于现代版本的MS Word,还是应该使用Microsoft.Office.Interop.Word?你能否请澄清一下?谢谢! - NoWar
2
我对这个答案唯一的反对意见是,PIA的Office 2013版本仍然发布 - 例如,如果您安装了VS2013,您会在C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ Visual Studio Tools for Office \ PIA \ Office15找到它们。 - Dan Ling
1
这只是历史的一部分。如果你用ildasm.exe仔细观察它们,你会发现它们是针对.NET 2.0.50727的。类型嵌入需要.NET 4。它们之所以存在,仅仅是因为VSTO仍然支持针对早期.NET版本的目标。部署它们完全是你的工作,客户不能提供帮助。 - Hans Passant
如果我使用新的引用(来自COM),它会在安装了Office 2007的计算机上工作吗?(我的计算机安装了Office 2016) - Dani
嗯,如果没有PIA,就没有办法支持多个Office版本,那么它们怎么可能成为“历史文物”,被“彻底而优雅地替换”呢? - Eldritch Conundrum
显示剩余3条评论

5

使用带有Office 365的VS 2015社区版时,由于某种原因,从COM对象添加功能无法正常工作。解决方法是进入GAC并找到interop程序集,将其复制到临时目录,然后像添加任何DLL一样将其添加到项目中。


1
此外,如果您还不知道,Windows 8确实有旧版本的.NET Framework,但它们不是默认安装的。转到程序功能 ---> 添加Windows功能 ----> 第一个复选框应该是.NET 3.0,可能还有2.0。请注意,如果您在WSUS服务器上,则需要告诉Windows从Windows更新服务器获取文件。希望能帮到您!

0

我刚刚发现Visual Studio 2013 Express不再支持Office。因此,您至少需要专业版才能使其正常工作。


我正在使用Visual Studio 2015社区版。它也没有Office支持。但是,对于VS 2015,可以从https://aka.ms/officedevtoolsforvs2015下载。解释这一点的文章在这里:https://blogs.msdn.microsoft.com/visualstudio/2016/04/26/the-latest-of-microsoft-office-developer-tools-office-add-in-commands-and-sharepoint-2016-support/。 - Aendie

0

官方上说,PIA与Office没有向后兼容性。但实际上它是可以使用的。

出于向后兼容性的原因,我多年来一直在使用PIA for Office XP,并且它可以很好地与Office XP、2003、2007和2010(尚未测试2013)以及Windows XP、Vista、7和8兼容。

为了与不同版本的Windows兼容,我使用.NET Framework 3.5。

对于未来...这取决于您如何使用PIA。如果可能的话,最好直接处理Open XML文件或为Word/Excel创建插件。


OpenXML不是替代品!文档很糟糕。示例代码难以找到。(试试获取OpenXML中单元格的背景颜色!玩得开心!)但主要问题是OpenXML不是解决方案,因为其中的公式都不会被执行。因此,如果单元格的内容由公式填充,除非使用真正的Office自动化,否则您将无法知道单元格具有什么值。 - Elmue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接