【问题标题】:ServicedComponent hosted in a Windows Service visible from COMServicedComponent 托管在从 COM 可见的 Windows 服务中
【发布时间】:2015-12-30 17:33:04
【问题描述】:

我正在迁移托管 COM 对象的旧 C++ Windows 服务。我设法创建了一个 .Net Windows 服务和一个 COM 可见的服务组件,但只在单独的项目中。

我需要的是让我们的遗留应用程序能够通过 COM 接口创建我的新对象的实例;这些对象应托管在 Windows 服务进程中,该进程可以通过“服务”管理工具进行管理(启动、延迟启动、暂停、恢复、停止)。它必须是 Windows 服务还有其他原因:

  • 在任何给定时间,其进程必须只有一个系统范围的实例。
  • 它必须是长期存在的,因为它保存静态数据并对其执行后台处理。
  • 它应该在第一个 COM 对象被实例化之前处于活动状态。
  • 它应该在第一个 COM 对象被实例化时自动启动,如果它当时因任何原因停止。
  • 对象实例将在服务进程中运行。
  • 以网络服务身份运行。
  • 客户端不会升级/修改。

Visual C++ 6.0 中旧的“COM 服务”构造很好地涵盖了所有这些要点,但对于 VB.Net Framework 4,我不知道该怎么做。

也许我可以以某种方式合并 .Net Windows 服务和服务组件,或者可能有其他方法可以在我的 Windows 服务中公开类。

编辑:

我忘了提到我需要它成为标准 Windows 服务的一个重要原因:当它要停止时,它必须能够执行一些相当冗长的任务。客户端将委托 COM 对象执行在后台执行的任务。如果服务过早停止,其中一些任务将被撤消。只要服务可以执行一些清理过程(插入、更新等),这可能需要从零到十秒或更多秒的时间,就可以了。它不需要是防弹的(它不会),但正常的系统关闭或维护服务停止不能留下未处理的东西。

【问题讨论】:

  • 差不多好了。该方法的问题是如何在服务停止时有序地释放资源。当服务停止时(在数据库中创建/更新记录),我有一些相当长的任务要做,而且我找不到使用这种方法的方法。我找到了可以挂钩的“AppDomain.ProcessExit”事件,但它会在 2 秒内强制终止我的代码,这在很多情况下太短了。
  • 当你覆盖ServiceBase.OnStop时,使用this.RequestAdditionalTime(estimatedTimeLeft)。您可以将工作委托给后台线程,让OnStop 线程在一个循环中等待来自后台线程的信号事件在estimatedTimeLeft 的周期内完成,每次调用RequestAdditionalTime,并在等待时返回t 超时。
  • 你是对的,保罗,如果有一个 ServiceBase 类。但是当我创建一个 ServicedComponent 派生对象时,没有 ServiceBase 的代码(至少没有我可以从中派生的)。这正是我的问题:ServicedComponent 和 ServiceBase 类在我的代码中在哪里相遇?我可以推断,当类被挂接到 COM+ NT 服务时,没有实现 ServiceBase。都是原生代码。
  • 是的,我的印象是您以某种方式自己托管服务组件!而是考虑实施IProcessInitializer

标签: .net com windows-services


【解决方案1】:

由于 .NET 服务组件是由 COM+ 托管的库(实际上是 dllhost.exe),因此您必须实现 IProcessInitializer 才能拥有进程启动和关闭事件。

要延长服务控制管理器等待服务启动的时间,您可以使用IProcessControlInit,通过从IProcessInitializer.Startup 转换对象。

【讨论】:

  • 谢谢!没有必要尝试经典的“COM 服务”方法。一个 COM+ 实现的 IProcessInitializer 配置为维护单个进程实例并且没有空闲关闭满足我的需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
相关资源
最近更新 更多