3

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

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

有谁知道该怎么做?

4

8 回答 8

2

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

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

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

  1. 在您的服务属性的登录选项卡中设置桌面复选框,并祈祷它安抚办公室之神。(它可能不会。)
    • 尝试 1 后,检查您的代码并尝试删除/解决任何导致其崩溃的问题。
  2. 使用远程处理/WCF 使执行互操作工作的服务器,并使您的服务与之通信。
    • 您需要有一个登录的交互式用户,并且该用户需要以某种方式启动服务器应用程序。也许最好使用自动启动。
    • You can try turning on Automatic login. http://support.microsoft.com/kb/324737
  3. Try impersonating a Logged in user using CreateProcessAsUser and friends.
    • Note: I don't know how well this works unless a user is actually logged in, so it might not be any more useful than 2 above, and is much harder to pull off. (Needs P/Invoke)
  4. Rewrite your program to use the OpenXML sdk or use something like SpreadsheetGear.
于 2009-06-23T06:36:04.527 回答
1

我确实从微软找到了一篇有趣的文章,基本上说不要做 Office 自动化。

于 2008-11-07T19:16:46.067 回答
1

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

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

于 2008-11-11T16:27:44.423 回答
1

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

于 2008-12-30T19:44:27.957 回答
0

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

于 2008-10-27T20:10:56.887 回答
0

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

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

于 2008-11-11T16:31:52.543 回答
0

你留下一个登录到机器的帐户吗?Office 不是服务器端应用程序,如果您尝试在没有桌面上下文的情况下启动任何可执行文件,您将收到随机错误。

于 2008-11-11T20:14:47.633 回答
0

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

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

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

于 2008-11-12T14:00:29.807 回答