【问题标题】:Calling A COM Component From .NET Windows Service从 .NET Windows 服务调用 COM 组件
【发布时间】:2011-09-18 17:55:20
【问题描述】:

我有一个用 .NET C# 编写的 Windows 服务,它调用一个 COM 组件。我还有一个用于测试 COM 组件的 .NET Windows Forms 测试应用程序。它在测试应用程序中运行良好。但是,当我在 Windows 服务中使用相同的代码时,什么也没有发生。 COM 组件将所有内容记录到文件中,并且没有生成日志文件这一事实暗示 COM 组件甚至没有被调用。

为什么这在我的测试应用程序中有效,但在 Windows 服务中无效?

【问题讨论】:

  • 请提供有关 COM 组件的一些详细信息。例如,它是用什么写的。也许组件假设它在一个有消息泵的进程中运行。
  • 该组件是用Visual Studio 6 用ATL 编写的。它是一个exe 组件(不是dll 或服务)
  • 那么,这是您第一次尝试在桌面应用程序之外使用该组件吗?从未在 ASP.NET 或 Web 服务中使用过它?这表明您依赖于消息泵或桌面应用程序之外不存在的其他东西。
  • 是的,这是我第一次尝试在桌面应用程序以外的任何地方使用。我认为存在某种权限问题,我正在尝试缩小范围。现在我想缩小是否调用该方法的范围。

标签: .net windows com service


【解决方案1】:

服务通常独立于桌面运行,因此当从服务调用时,您对 COM 组件的调用与 UI 是隔离的。您可以allow a service to "interactWithDesktop”查看使用交互式服务部分。

Microsoft (<sarcasm>in their infinite wisdom</sarcasm>) 决定将从 Window vista 中删除此功能,并建议 separating your application into multiple parts and using other mechanisms 完成 UI 和服务之间的通信。显然,有些人(包括我自己)不同意,但是,事实就是这样......

http://msdn.microsoft.com/en-us/library/ms683502.aspx

http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/e50d8819-d628-48e2-aa2c-6ac6de8380d9/

【讨论】:

  • 这与能够从 .NET 服务调用 COM 组件有何关系?
  • 我怀疑服务 IS 与 COM 通信,但您没有观察到该交互,因为 COM(在服务空间中运行)无法与您的桌面(或其他用户空间),让您看到该组件正在工作。
  • 为什么如果我调试 com 组件,当我从用 C# .NET 编写的 windows 窗体应用程序调用它时,它会在方法开始时的断点处中断,但是当它从windows服务不坏吗?这就是为什么我认为它没有调用 COM 组件。
  • 您只是尝试从 VS 运行服务还是附加到进程?调试服务与调试 Winforms 应用程序有点不同。 (msdn.microsoft.com/en-us/library/7a50syb3%28v=VS.100%29.aspx)
  • 我不想调试服务。我正在调试从 Windows 服务调用的 com 组件。我可以通过附加到它的运行实例来很好地调试 Windows 服务。但这不是我目前想要做的。我可以看到该服务正在尝试调用 COM 组件,但它没有调用它。相同的代码在表单应用中也能正常工作。
【解决方案2】:

您是否在 LocalSystem 帐户(Windows 服务的默认帐户)中运行您的服务?您的 COM 组件可能需要访问可以正常运行的帐户中的可用资源...

尝试编辑您的服务并在 Log On tab 上指定您的帐户。

【讨论】:

    猜你喜欢
    • 2011-06-23
    • 2010-10-19
    • 2010-09-15
    • 2013-01-10
    • 1970-01-01
    • 2013-04-25
    • 2010-11-06
    • 2011-07-01
    • 1970-01-01
    相关资源
    最近更新 更多