从.NET Windows服务调用本地DLL失败

我有一个使用DllImport从C#调用的原生dll格式的第三方API。 这个本地DLL取决于正在打开的第三方应用程序。

当我正常运行代码时,API将执行预期的操作并驱动应用程序。 但是,当我作为Windows服务运行相同的代码时,即使在我自己的情况下,API也会返回我在应用程序closures时看到的相同(未logging的)错误代码; 进程资源pipe理器确认本地dll是从应用程序目录正确加载的。

有什么可能导致这个问题,我怎么能解决这个问题?

Solutions Collecting From Web of "从.NET Windows服务调用本地DLL失败"

有点旧了,但是它是搜索中最重要的结果之一。 所以我认为我的数据仍然是有用的。

我有一个使用DllImport从C#调用的原生dll格式的第三方API。 这个本地DLL取决于正在打开的第三方应用程序。

(t)生锈的Office Interop DLL是相同的方式。 实际上,您正在启动Office程序的后台实例。 后台实例需要一个交互式会话,即使它没有显示任何东西(设计假设/工作中的错误)。 自Vista以来,服务不会在交互式会话中运行。 不推荐使用覆盖。 这是不再使用Office Interop的(3?)原因之一。

可能的解决方法:

  1. 停止使用服务。 Windows任务sheduler可以做同样的工作,同时给你完整的交互式会话。 甚至MS自己也开始把东西从服务中转移到Sheduler中
  2. 将DLL访问移入辅助进程。 那个可以在交互式会话中运行。 帮助者和主要服务之间使用任何进程间通信方式进行通信。 这种模式主要用于处理来自x64程序的x32 DLL,但它也应该在这里工作。 清单和Process.Start()都有一种方法来从一个服务交互式地启动一个程序。

根据其中的一条评论,您可以选择选项2,而是使用Web服务。 不幸的是,Webserices / Web应用程序通常作为Windows服务运行。 那是在你考虑到它们在一些最严格的权限下运行(因为它们是web可达的)。 所以这只会让你回到方形1,甚至是倒退到方形0。

很难说,但我能想到的有三种可能性:

  • 您的服务具有需要“与桌面交互”选项的UI组件
  • Windows服务的工作目录是%WinDir%\ system32(例如C:\ windows \ system32),并且您的dll具有使用相对路径引用来查找其他无法找到的资源的代码
  • 您的服务使用与两个不同会话中运行的应用程序的netpipe通信