程序可以从控制台正常运行,但不能从Windows Service运行

时间:2019-07-22 17:18:06

标签: c# .net excel

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

我已经做了大量的工作来寻找这个问题,但是我发现的任何解决方案都不适用于我的情况。 值得注意的是,我尝试过更改组件服务(according to this post),但是DCOM Config中根本没有Excel组件。

任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:2)

错误代码0x800A03EC(或-2146827284)表示NAME_NOT_FOUND;换句话说,您要的是东西,而Excel无法找到它。

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

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

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

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