【问题标题】:Program runs properly from console, but not from Windows Service程序从控制台正常运行,但不能从 Windows 服务运行
【发布时间】:2019-11-30 17:08:22
【问题描述】:

我有一个使用标准 Microsoft.Office.Interop.Excel 库与 Excel 电子表格交互的 .net 程序。该程序将文件路径作为命令行参数,它自己运行良好。

我还有一个 Windows 服务,它实现了一个文件侦听器来检测某个目录中的更改。当检测到新文件时,将调用 Excel 程序以及文件路径。

这个执行开始时很好,但是一旦 Excel 程序尝试打开文件:

wb = excel.Workbooks.Open(FileName);

它崩溃并出现以下错误:

System.Runtime.InteropServices.COMException (0x800A03EC): Exception from HRESULT: 0x800A03EC
   at Microsoft.Office.Interop.Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad)

请注意,代码本身运行良好,但是当程序被 Windows 服务调用时,它会失败。

我已针对此问题进行了大量搜索,但我找到的解决方案均不适用于我的案例。 值得注意的是,我尝试更改组件服务(according to this post),但我的 DCOM Config 中根本没有 Excel 组件。

非常感谢任何建议!

【问题讨论】:

  • 您的服务运行情况如何?它是否在交互式用户帐户下运行?
  • 您的服务是否以特定用户身份运行?
  • 办公自动化不是为在无头服务帐户下运行而设计的,即使您成功了,最终也会导致 Excel 进程在后台徘徊(未正常关闭)并耗尽内存一个结果。您可以获得旨在用于无头服务的第三方组件。
  • @Ian Robertson 感谢您的建议!我尝试在我的个人用户帐户下运行该服务,但我最终遇到了同样的错误。我想我会开始寻找解决方法。再次感谢。
  • 您可能希望以 32 位运行 DCOM 配置以查看 Excel 是否存在。 (如果我记得正确的 32 位和 64 位配置是独立的。)另外,我相信即使您这样做,也需要有人登录系统才能使其正常工作。即使这样,登录的用户也可能会看到 Excel 中的弹出对话框。 - 至少对于我需要它设置的场景。

标签: c# .net excel


【解决方案1】:

错误代码 0x800A03EC(或 -2146827284)表示 NAME_NOT_FOUND;换句话说,你已经要求了一些东西,而 Excel 找不到它。

只是一个想法:您是否要打开相对于应用程序安装路径的 excel 文件?请记住,在运行 Windows 服务时,工作目录与安装应用程序的位置不同。

服务从称为服务控制管理器的应用程序启动。此应用程序位于系统目录 %WinDir%\System32

因此,如果您从控制台启动应用程序,则工作目录与安装应用程序的目录相同。如果 excel 文件是本地文件,或者相对于应用程序的安装路径,它会运行得很好。但是,当作为 Windows 服务运行时,它会在 %WinDir%\System32 目录中或相对路径中查找文件。

如果是上述情况,请尝试使用绝对路径(最好在 appsettings 中配置)或正确设置工作目录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-25
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多