托管在从 COM 可见的 Windows 服务中的 ServicedComponent
ServicedComponent hosted in a Windows Service visible from COM
我正在迁移托管 COM 对象的旧 C++ Windows 服务。我设法创建了一个 .Net Windows 服务和一个 COM 可见服务组件,但仅在单独的项目中。
我需要的是让我们的遗留应用程序能够通过 COM 接口创建我的新对象的实例;这些对象应托管在 Windows 服务进程中,该进程可以通过 "Services" 管理工具进行管理(启动、延迟启动、暂停、恢复、停止)。它必须是 Windows 服务还有其他原因:
- 在任何给定时间必须只有一个系统范围的进程实例。
- 它必须是长期存在的,因为它保存静态数据并对其执行后台处理。
- 它应该在第一个 COM 对象被实例化之前处于活动状态。
- 它应该在第一个 COM 对象被实例化时自动启动,如果当时由于任何原因停止的话。
- 对象实例将 运行 在服务进程中。
- 以网络服务标识运行。
- 客户端不会升级/修改。
Visual C++ 6.0 的旧 "COM Service" 构造很好地涵盖了所有这些要点,但是对于 VB.Net Framework 4 我不知道如何去做。
也许我可以以某种方式合并 .Net Windows 服务和服务组件,或者可能有其他方法在我的 Windows 服务中公开 类。
编辑:
我忘了提到一个重要的原因,我需要它成为一个标准的 Windows 服务:当它要停止时,它必须能够执行一些相当冗长的任务。客户端将委托 COM 对象在后台执行任务。如果服务过早停止,其中一些任务将无法完成。只要服务可以执行一些清理过程(插入、更新等)就可以,这可能需要 none 到十秒或更长时间。它不需要是防弹的(它不会),但正常的系统关闭或维护服务停止一定不能留下未处理的东西。
由于 .NET 服务组件是由 COM+ 托管的库(dllhost.exe,实际上),您必须实施 IProcessInitializer
才能处理启动和关闭事件。
要延长服务控制管理器等待服务启动的时间,您可以使用 IProcessControlInit
,方法是从 IProcessInitializer.Startup
.
强制转换对象
我正在迁移托管 COM 对象的旧 C++ Windows 服务。我设法创建了一个 .Net Windows 服务和一个 COM 可见服务组件,但仅在单独的项目中。
我需要的是让我们的遗留应用程序能够通过 COM 接口创建我的新对象的实例;这些对象应托管在 Windows 服务进程中,该进程可以通过 "Services" 管理工具进行管理(启动、延迟启动、暂停、恢复、停止)。它必须是 Windows 服务还有其他原因:
- 在任何给定时间必须只有一个系统范围的进程实例。
- 它必须是长期存在的,因为它保存静态数据并对其执行后台处理。
- 它应该在第一个 COM 对象被实例化之前处于活动状态。
- 它应该在第一个 COM 对象被实例化时自动启动,如果当时由于任何原因停止的话。
- 对象实例将 运行 在服务进程中。
- 以网络服务标识运行。
- 客户端不会升级/修改。
Visual C++ 6.0 的旧 "COM Service" 构造很好地涵盖了所有这些要点,但是对于 VB.Net Framework 4 我不知道如何去做。
也许我可以以某种方式合并 .Net Windows 服务和服务组件,或者可能有其他方法在我的 Windows 服务中公开 类。
编辑:
我忘了提到一个重要的原因,我需要它成为一个标准的 Windows 服务:当它要停止时,它必须能够执行一些相当冗长的任务。客户端将委托 COM 对象在后台执行任务。如果服务过早停止,其中一些任务将无法完成。只要服务可以执行一些清理过程(插入、更新等)就可以,这可能需要 none 到十秒或更长时间。它不需要是防弹的(它不会),但正常的系统关闭或维护服务停止一定不能留下未处理的东西。
由于 .NET 服务组件是由 COM+ 托管的库(dllhost.exe,实际上),您必须实施 IProcessInitializer
才能处理启动和关闭事件。
要延长服务控制管理器等待服务启动的时间,您可以使用 IProcessControlInit
,方法是从 IProcessInitializer.Startup
.