Vista,Office Interop无法正常工作

时间:2008-10-27 19:50:45

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

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

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

有谁知道该怎么做?

8 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

我确实发现微软的interesting article基本上说不做Office自动化。

答案 2 :(得分:1)

从中获取可安装程序 http://www.microsoft.com/downloads/details.aspx?FamilyID=59daebaa-bed4-4282-a28c-b864d8bfa513&displaylang=en

在您的系统上安装它并在您的解决方案中引用excel dll,希望它能够正常工作。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

要记住关于Office的事情。它只是x86,所以如果你在x64中创建一个应用程序,你将无法访问Office底层的COM对象。您将需要在x86中编译您的应用程序,然后它才能工作。

您可以通过进入项目的属性,然后在visual studio的构建选项卡下选择x86来实现。

这是假设您的应用程序正在x64环境中开发/运行。