程序从控制台正常运行,但不能从 Windows 服务运行



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

我还有一个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 服务调用该程序时,它会失败。

我已经对这个问题进行了大量搜索,但我找到的解决方案都不适用于我的情况。 值得注意的是,我已经尝试更改组件服务(根据这篇文章),但我的 DCOM 配置中根本没有 Excel 组件。

任何建议将不胜感激!

错误代码0x800A03EC(或 -2146827284)表示NAME_NOT_FOUND;换句话说,您请求了某些内容,而 Excel 找不到它。

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

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

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

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

最新更新