【问题标题】:Vista, Office Interop not workingVista,Office 互操作不工作
【发布时间】:2010-09-19 11:07:57
【问题描述】:

有谁知道如何让 MS Office 2007 .NET C# Interop 库与 Vista 一起使用?

我有一个已设置为作为 Windows 服务运行的 .NET C# 应用程序。该程序将根据情况打开一个 Word 或 Excel 模板并修改其内容,然后将文档保存回来。当我在使用 Office 2007 的 Windows Server 2003 或 XP 机器上执行此操作时,所有这些都非常有效。当我将所有内容移至 Server 2008 机器时,一切都停止工作了。例如,在 Excel 中,我收到一个 COM 异常,告诉我当文件明显存在时无法打开 Excel 文件,而我可以在手动打开它时很好地打开它。 Windows 服务在我登录机器的同一用户帐户下运行,该帐户是管理员。

有人知道该怎么做吗?

【问题讨论】:

    标签: c# interop ms-office office-2007


    【解决方案1】:

    您是否在服务器上安装了主要的互操作程序集?这些通常位于 GAC 中,并且在您构建程序时不包含在 bin 目录中,因此需要在服务器本地安装它们。

    【讨论】:

    • 是的,Interops 在 GAC 中。
    【解决方案2】:

    我确实找到了来自 Microsoft 的 interesting article,基本上说不要使用 Office 自动化。

    【讨论】:

    • 是的,在 Office 2007 中,他们将文件格式重新设置为 Office Open XML 或其他格式,这样您就可以直接操作文件的内容,而无需启动其中一个 Office 应用程序。启动 Word 或 Excel 的唯一原因应该是现在打印。
    【解决方案3】:

    http://www.microsoft.com/downloads/details.aspx?FamilyID=59daebaa-bed4-4282-a28c-b864d8bfa513&displaylang=en

    在您的系统上安装它并在您的解决方案中引用 excel dll,希望它应该可以工作。

    【讨论】:

      【解决方案4】:

      这只是一个猜测,但它可能是 UAC。我知道特权(管理员)应用程序和用户应用程序不能相互发送消息或以任何方式进行通信。您的服务以管理员身份运行,但您的桌面在 UAC 下以普通用户身份运行,即使他们是同一用户。我还希望 Office 在启动时已启动(预加载)自身的一部分,并且会以普通用户身份运行。

      尝试关闭 UAC,看看是否有帮助。如果是这样,至少你知道它是什么。

      【讨论】:

      • 我关闭了 UAC 并得到了相同的结果
      【解决方案5】:

      您是否在计算机上留下了登录帐户? Office 不是服务器端应用程序,如果您尝试在没有桌面上下文的情况下启动任何可执行文件,则会出现随机错误。

      【讨论】:

        【解决方案6】:

        关于 Office 的一些注意事项。它仅适用于 x86,因此如果您在 x64 中创建应用程序,您将无法访问 Office 底层 COM 对象。您需要在 x86 中编译您的应用程序,然后它才能工作。

        您可以通过进入项目的属性,然后在 Visual Studio 的构建选项卡下选择 x86 来做到这一点。

        这一切都假设您的应用正在 x64 环境中开发/运行。

        【讨论】:

          【解决方案7】:

          您确实应该避免将 Office 客户端作为服务器端应用程序运行。考虑使用 xml 作为文件格式(Office 2007 使用 xlsx,或者(有些)旧版本使用 Excel 工作簿 xsd。)然后您就无需在服务器上使用 Excel API。

          【讨论】:

            【解决方案8】:

            在 Vista 和 Windows Server 2008 上,服务在称为 Session0 的东西中运行。在 Vista 之前,常规程序将与服务一起在 Session0 中运行。

            这意味着 Session0 已成为一个没有桌面的荒地,您的服务甚至无法访问 explorer.exe。我很确定问题在于 Office 应用程序期望能够访问通常在桌面上的一些组件。

            由于 Excel、Word 等仅在桌面版会话中受支持,因此您只有几个选择:

            1. 在您的服务属性的登录选项卡中设置桌面复选框,并祈祷它安抚办公室之神。 (它可能不会。)
              • 尝试 1 后,检查您的代码并尝试删除/解决任何导致其崩溃的问题。
            2. 使用远程处理/WCF 使服务器执行互操作工作,并使您的服务与其通信。
              • 您需要有一个已登录的交互式用户,并且该用户需要以某种方式启动服务器应用程序。也许最好使用自动启动。
              • 您可以尝试开启自动登录。 http://support.microsoft.com/kb/324737
            3. 尝试使用 CreateProcessAsUser 和朋友模拟登录用户。
              • 注意:除非用户实际登录,否则我不知道它的效果如何,因此它可能不会比上面的 2 更有用,而且更难实现。 (需要 P/Invoke)
            4. 重写您的程序以使用 OpenXML sdk 或使用类似 SpreadsheetGear 的东西。

            【讨论】:

              猜你喜欢
              • 2018-05-27
              • 1970-01-01
              • 2010-10-20
              • 1970-01-01
              • 2010-10-27
              • 1970-01-01
              • 2011-04-15
              • 2013-06-09
              • 1970-01-01
              相关资源
              最近更新 更多