Microsoft Office Interop程序集参考

时间:2009-08-06 15:26:40

标签: excel visual-studio-2005 interop outlook global-assembly-cache

我在Visual Studio 2005中开发了一个应用程序,我使用ClickOnce进行部署。我的解决方案包含两个项目 - 用VB编码的用户界面层和用C#编码的类库。我的C#类库有一些使用Outlook和Excel互操作程序集的代码(Microsoft.Office.Interop.Outlook和Microsoft.Office.Interop.Excel,版本11)。这是我的问题。

  1. 虽然我还没有找到绝对的说法,但我的理解是你必须拥有适当版本的Office应用程序(Outlook / Excel)才能安装使用Interop程序集的应用程序。这是对的吗?
  2. 如果(1. =是)则

    您如何处理您的应用程序仅使用Interop程序集的几种功能的情况,这些功能将仅由少数总用户群使用?如果只有部分用户需要使用这些功能,为什么我必须要求我的应用程序的每个用户安装Microsoft Office?这些Interop程序集只是 .dll 文件,因此它们与其他文件的不同之处在于,您无法仅使用项目发布文件,并且无论在何处安装软件,都能满足引用要求。客户端? (显然,我对GAC的理解很差,并且它对Visual Studio的行为有影响。)我很乐意编写自己的代码来检查是否存在使用它们的少数功能所需的Office软件。没有办公室,无法访问功能...

    否则

    如果我对此的理解不正确,那么我如何设置我的引用和ClickOnce设置,以便用户在安装尝试时不会遇到以下错误?

    “无法安装或运行应用程序。该应用程序要求首先在全局程序集缓存(GAC)中安装程序集团版本11.0.0.0。

    请与您的系统管理员联系。“

    • 我尝试将Interop引用CopyLocal属性设置为True和False。
    • 在我的ClickOnce应用程序文件列表中,我尝试将这些程序集设置为Include,Exclude和Prerequisite。
    • 在我的研究中,我看到有些人将这些引用指向* C:\ WINDOWS \ assembly \ GAC *,我的指向* C:\ Program Files \ Microsoft Visual Studio 9.0 \ Visual Studio Tools for Office \ PIA \ Office11 *但我还没有找到改变参考路径的方法。根据{{​​3}},您无法添加GAC的引用,那么其他人如何管理呢?
    • 我尝试将* C:\ Program Files \ Microsoft Visual Studio 9.0 \ Visual Studio Tools for Office \ PIA \ Office11 *中的引用复制到我的项目目录并在那里引用它们。

    结束

    我想我需要知道的主要事情是如何/如果我可以在我的出版物中包含这些程序集并满足或绕过GAC要求。

    如果可能,请尽量直接回答我的具体问题。虽然文章很有帮助,但我已经阅读了很多文章并尝试了很多建议的解决方案并且没有找到成功。请记住,我对这一切的工作原理缺乏了解。

    请原谅我缺乏理解,并感谢您提供的任何帮助。非常感谢!

5 个答案:

答案 0 :(得分:8)

您可能希望查看NetOffice项目:http://netoffice.codeplex.com/

它是一个免费的(MIT许可证)和完整的(所有版本2000-2010和所有Office应用程序)一组独立于版本的互操作程序集。程序集是使用工具从实际PIA生成的,因此它们是正确的,完整的和最新的,并且可能会在将来的版本中快速更新。

另一个不错的功能是每个成员的IntelliSense显示哪个Office版本实现该成员。

对于部署,您可以使用您的应用程序复制或安装程序集。

答案 1 :(得分:2)

根据我的经验,尝试在广泛的部署方案中管理办公室互操作程序集是一场噩梦。如果您通过ClickOnce进行部署,即使您解决了上面提到的GAC问题(也许通过让您的IT部门推出互操作程序集的GAC注册,如果这是企业环境),您将需要处理用户拥有与标准不同的Office版本 - 当Office 13出现并且用户开始升级并且它会破坏您的应用程序时,天堂会帮助您。

为了使用与版本相关的互操作程序集,可以使用pinvoke直接对Office COM包装器进行办公自动化,这与版本无关(它们将客户端上的当前办公室版本拉出注册表)。但是,这会有自己的部署挑战(例如,您可能需要更新注册表来处理安装了PIA的计算机,这在使用ClickOnce进行部署时可能非常具有挑战性),而且开发起来要困难得多。

如果我在你的鞋子里,我会先仔细看看你在课堂图书馆中使用的互操作功能 - 是否有另一种方法来提供你需要的功能,办公室互操作之外客户端机器?也许是面向服务的解决方案,客户提交服务器请求以生成自定义的办公室文档并提供下载...

答案 2 :(得分:1)

以下是我从经验中得到的结论(我应该指出,我们没有使用ClickOnce,但我不确定为什么会这么重要):

如果您写入Excel 2003 API并使用Excel 2007部署到计算机,它将起作用,因为Excel 2007实际上是模拟Excel 2003.问题是某些API已更改,而且它们是一些甚至已被删除的API。您必须自己尝试一下,看看您的应用程序是否受到影响。

事实上,它稍微差一些。如果在安装了Excel 2003和Excel 2007的计算机上运行应用程序,则使用Interop仍将使用Excel 2007。

一种可能性是使用SpreadsheetGear for .NET,它为您提供了一个Excel兼容的Windows窗体控件,它完全在一个.NET程序集中实现,您可以使用您的应用程序进行部署 - 因此您的应用程序将不依赖于Office。

如果您想试用,可以免费试用here

免责声明:我拥有SpreadsheetGear LLC

答案 3 :(得分:1)

最好的方法是使用后期绑定库

https://sourceforge.net/projects/exceldata/

  • 使用iterops和tlbs使用不同的办公室版本时没有任何问题
  • 各办事处的支持
  • 易于修改

然而:

  • 很难支持这个库

答案 4 :(得分:0)

使用COM接口和后期绑定。 VB.NET一直支持后期绑定。只需使用Marshal.GetActiveObject()并将变量的类型设置为Object。您可以创建一个VB.NET对象来执行此操作并从C#中调用它。

使用C#,如果使用反射API,则会得到延迟绑定,但使用此代码编写代码非常痛苦。在C#4中,您还可以通过动态类型获得后期绑定。

如果执行此操作,则无需分发任何Office程序集,只要Office API中对象的属性不发生更改,您的代码就会起作用。

后期绑定代码比早期绑定代码慢,但出于多种目的,这不是问题。