我有一个使用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] 举报,一经查实,本站将立刻删除。