【问题标题】:Microsoft Office Interop Assembly referencesMicrosoft Office 互操作程序集参考
【发布时间】:2010-11-17 09:39:00
【问题描述】:

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

  1. 虽然我还没有发现这是绝对的,但我的理解是,您必须拥有适当版本的 Office 应用程序 (Outlook/Excel) 才能安装使用互操作程序集的应用程序。这是正确的吗?

如果 (1. = 是) 那么

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

否则

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

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

请联系您的系统管理员。”

  • 我尝试将我的 Interop 引用 CopyLocal 属性设置为 True 和 False。
  • 在我的 ClickOnce 应用程序文件列表中,我尝试将这些程序集设置为包含、排除和先决条件。
  • 在我的研究中,我发现有些人的这些引用指向 *C:\WINDOWS\assembly\GAC*,我的指向 *C:\Program Files\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA \Office11* 但我还没有找到改变引用路径的方法。根据http://msdn.microsoft.com/en-us/library/ez524kew(VS.80).aspx,您无法添加来自 GAC 的引用,那么其他人是如何管理的?
  • 我已尝试将引用从 *C:\Program Files\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA\Office11* 复制到我的项目目录并在那里引用它们。

如果结束

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您可能想看看 NetOffice 项目:http://netoffice.codeplex.com/

    它是免费的(MIT 许可)和完整的(所有版本 2000-2010 和所有 Office 应用程序)与版本无关的互操作程序集。这些程序集是使用工具从实际 PIA 生成的,因此它们是正确、完整和最新的,并且可能会在未来版本中快速更新。

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

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

    【讨论】:

      【解决方案2】:

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

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

      如果您这样做,则无需分发任何 Office 程序集,只要 Office API 中对象的属性不变,您的代码就可以工作。

      后期绑定代码比早期绑定代码慢,但在很多情况下这不是问题。

      【讨论】:

        【解决方案3】:

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

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

        • 不同 office 版本的 iterops 和 tlb 不会出现问题
        • 各种办事处的支持
        • 易于修改

        但是:

        • 很难支持这个库

        【讨论】:

          【解决方案4】:

          这是我从经验中了解到的(我应该指出,我们没有使用 ClickOnce,但我不知道为什么这很重要):

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

          事实上,它比那更糟。如果您在安装了 Excel 2003 和 Excel 2007 的机器上运行您的应用程序,您对 Interop 的使用仍将使用 Excel 2007。

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

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

          免责声明:我拥有 SpreadsheetGear LLC

          【讨论】:

            【解决方案5】:

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

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

            如果我站在你的立场上,我会先仔细研究一下你在类库中使用的互操作功能——有没有另一种方法来提供你需要的功能,在办公室互操作之外客户端机器?也许是面向服务的解决方案,客户端向服务器提交请求以生成定制的办公文档并提供下载...

            【讨论】:

            • 感谢您的回复。到目前为止,我还没有遇到版本冲突问题——同时使用 2003 和 2007 的用户都能够很好地使用这些功能。我想一个更简单的问题来真正针对我想知道的是,我可以让我的应用程序可以安装给没有任何版本的 Office 的用户,允许他们使用我的应用程序的非互操作功能吗?我知道他们必须有 Outlook/Excel 才能使用我基于互操作的功能,但我的大多数应用程序与 Office 无关。
            • 我认为一个 Interop 代码实例不会将您的应用程序完全限制为安装了 Office 的用户。
            • 要尝试的一件事是使用按需下载 (msdn.microsoft.com/en-us/library/ak58kz04(VS.80).aspx) - 您应该能够编码,以便在调用/下载包含您的 Office 互操作类的程序集之前,有一个检查是否安装了 Office。我不知道 ClickOnce 是否会延迟检查依赖项,直到实际请求下载按需程序集,或者它是否会检查所有可能的依赖项。
            • 这看起来很有趣。这是我第一次听说它;我得试一试,看看我是否有更好的运气。谢谢,如果这有助于解决我的问题,我会回复。
            • Guy- 使用 MSDN 上概述的技术使程序集“可选”并没有解决我的问题。我仍然收到错误消息,说我需要 GAC 中的程序集并且不允许我安装应用程序。还有其他想法吗?让我感到非常沮丧和困惑的是,在应用程序中使用一两次 Office Interop 会使任何未安装 Microsoft Office 的人完全卸载该应用程序。
            猜你喜欢
            • 1970-01-01
            • 2011-07-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-10
            • 1970-01-01
            • 1970-01-01
            • 2013-06-09
            相关资源
            最近更新 更多