微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

将窗口焦点恢复到之前的所有者

LINQ程序集位于Windows XP中?

如何编写一个连续监听的服务器作为服务

将.NET应用程序添加到registry以在重新启动后启动以完成某些操作

获取进程私有工作集内存

在C#中使用特定服务的cpu使用情况

通缉:不受AbandonedMutexException影响的跨进程同步

进程的当前目录是否与其工作目录相同?

Sapi不停地向所有(一个)进程窗口发送击键

以编程方式隐藏PropertyGrid中的属性

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

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

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

可能的解决方法

停止使用服务。 Windows任务sheduler可以做同样的工作,同时给你完整的交互式会话。 甚至MS自己也开始把东西从服务中转移到Sheduler中

将DLL访问移入辅助进程。 那个可以在交互式会话中运行。 帮助者和主要服务之间使用任何进程间通信方式进行通信。 这种模式主要用于处理来自x64程序的x32 DLL,但它也应该在这里工作。 清单和Process.Start()都有一种方法来从一个服务交互式地启动一个程序。

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

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

您的服务具有需要“与桌面交互”选项的UI组件

Windows服务的工作目录是%WinDir% system32(例如C: windows system32),并且您的dll具有使用相对路径引用来查找其他无法找到的资源的代码

您的服务使用与两个不同会话中运行的应用程序的netpipe通信

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐