从COM

时间:2015-10-02 13:30:40

标签: .net com windows-services

我正在迁移托管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对象执行要在后台执行的任务。如果服务提前停止,其中一些任务将被撤消。只要服务可以执行一些清理程序(插入,更新等),这可能需要从无到十秒或更长时间,这是可以的。它不需要是防弹(它不会),但正常的系统关闭或维护服务停止不得留下不守的东西。

1 个答案:

答案 0 :(得分:2)

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

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