ServiceInstaller 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
安装一个类,该类扩展 ServiceBase 来实现服务。 在安装服务应用程序时由安装实用工具调用该类。
public ref class ServiceInstaller : System::Configuration::Install::ComponentInstaller
public class ServiceInstaller : System.Configuration.Install.ComponentInstaller
type ServiceInstaller = class
inherit ComponentInstaller
Public Class ServiceInstaller
Inherits ComponentInstaller
- 继承
示例
以下示例创建一个名为 MyProjectInstaller
的项目安装程序,它继承自 Installer。 假设有一个包含两个服务的服务可执行文件,即“Hello-World 服务 1”和“Hello-World 服务 2”。 在将由安装实用工具) 调用 (的构造函数MyProjectInstaller
中,ServiceInstaller为每个服务创建对象,并为可执行文件创建 。ServiceProcessInstaller 对于要识别 MyProjectInstaller
为有效安装程序的安装实用工具,属性 RunInstallerAttribute 设置为 true
。
在将安装程序添加到 Installers 集合之前,将在进程安装程序和服务安装程序上设置可选属性。 当安装实用工具访问 MyProjectInstaller
时,将依次安装通过 调用 InstallerCollection.Add 添加到Installers集合的对象。 在此过程中,安装程序维护状态信息,指示已安装了哪些对象,因此,如果安装失败,可以依次备份每个对象。
通常,不会显式创建项目安装程序类的实例。 可以创建它并将 属性添加到 RunInstallerAttribute 语法中,但实际调用类并因此实例化的是安装实用工具。
#using <System.dll>
#using <System.ServiceProcess.dll>
#using <System.Configuration.Install.dll>
using namespace System;
using namespace System::Collections;
using namespace System::Configuration::Install;
using namespace System::ServiceProcess;
using namespace System::ComponentModel;
[RunInstaller(true)]
public ref class MyProjectInstaller : public Installer
{
private:
ServiceInstaller^ serviceInstaller1;
ServiceInstaller^ serviceInstaller2;
ServiceProcessInstaller^ processInstaller;
public:
MyProjectInstaller()
{
// Instantiate installers for process and services.
processInstaller = gcnew ServiceProcessInstaller;
serviceInstaller1 = gcnew ServiceInstaller;
serviceInstaller2 = gcnew ServiceInstaller;
// The services run under the system account.
processInstaller->Account = ServiceAccount::LocalSystem;
// The services are started manually.
serviceInstaller1->StartType = ServiceStartMode::Manual;
serviceInstaller2->StartType = ServiceStartMode::Manual;
// ServiceName must equal those on ServiceBase derived classes.
serviceInstaller1->ServiceName = "Hello-World Service 1";
serviceInstaller2->ServiceName = "Hello-World Service 2";
// Add installers to collection. Order is not important.
Installers->Add( serviceInstaller1 );
Installers->Add( serviceInstaller2 );
Installers->Add( processInstaller );
}
static void Main()
{
Console::WriteLine("Usage: InstallUtil.exe [<service>.exe]");
}
};
int main()
{
MyProjectInstaller::Main();
}
using System;
using System.Collections;
using System.Configuration.Install;
using System.ServiceProcess;
using System.ComponentModel;
[RunInstaller(true)]
public class MyProjectInstaller : Installer
{
private ServiceInstaller serviceInstaller1;
private ServiceInstaller serviceInstaller2;
private ServiceProcessInstaller processInstaller;
public MyProjectInstaller()
{
// Instantiate installers for process and services.
processInstaller = new ServiceProcessInstaller();
serviceInstaller1 = new ServiceInstaller();
serviceInstaller2 = new ServiceInstaller();
// The services run under the system account.
processInstaller.Account = ServiceAccount.LocalSystem;
// The services are started manually.
serviceInstaller1.StartType = ServiceStartMode.Manual;
serviceInstaller2.StartType = ServiceStartMode.Manual;
// ServiceName must equal those on ServiceBase derived classes.
serviceInstaller1.ServiceName = "Hello-World Service 1";
serviceInstaller2.ServiceName = "Hello-World Service 2";
// Add installers to collection. Order is not important.
Installers.Add(serviceInstaller1);
Installers.Add(serviceInstaller2);
Installers.Add(processInstaller);
}
public static void Main()
{
Console.WriteLine("Usage: InstallUtil.exe [<service>.exe]");
}
}
Imports System.Collections
Imports System.Configuration.Install
Imports System.ServiceProcess
Imports System.ComponentModel
<RunInstallerAttribute(True)> _
Public Class MyProjectInstaller
Inherits Installer
Private serviceInstaller1 As ServiceInstaller
Private serviceInstaller2 As ServiceInstaller
Private processInstaller As ServiceProcessInstaller
Public Sub New()
' Instantiate installers for process and services.
processInstaller = New ServiceProcessInstaller()
serviceInstaller1 = New ServiceInstaller()
serviceInstaller2 = New ServiceInstaller()
' The services will run under the system account.
processInstaller.Account = ServiceAccount.LocalSystem
' The services will be started manually.
serviceInstaller1.StartType = ServiceStartMode.Manual
serviceInstaller2.StartType = ServiceStartMode.Manual
' ServiceName must equal those on ServiceBase derived classes.
serviceInstaller1.ServiceName = "Hello-World Service 1"
serviceInstaller2.ServiceName = "Hello-World Service 2"
' Add installers to collection. Order is not important.
Installers.Add(serviceInstaller1)
Installers.Add(serviceInstaller2)
Installers.Add(processInstaller)
End Sub
Public Shared Sub Main()
Console.WriteLine("Usage: InstallUtil.exe [<service>.exe]")
End Sub
End Class
注解
确实 ServiceInstaller 适用于与其关联的服务。 安装实用工具使用它将与服务关联的注册表值写入HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services注册表项中的子项。 服务在此子项中由其 ServiceName 标识。 子项还包括服务所属的可执行文件或.dll的名称。
若要安装服务,请创建继承自 Installer 类的项目安装程序类,并将 类上的 属性设置为 RunInstallerAttributetrue
。 在项目中,为每个服务应用程序创建一个 ServiceProcessInstaller 实例,并为应用程序中的每个服务创建一个 ServiceInstaller 实例。 在项目安装程序类构造函数中,使用 ServiceProcessInstaller 和 ServiceInstaller 实例设置服务的安装属性,并将实例添加到集合中 Installers 。
注意
建议使用 构造函数添加安装程序实例;但是,如果需要在 方法中将 添加到 Installers 集合, Install 请确保在 方法中 Uninstall 对集合执行相同的添加。
对于派生自 Installer 类的所有类,集合的状态Installers在 和 Uninstall 方法中Install必须相同。 但是,如果在自定义安装程序类构造函数中将安装程序实例添加到Installers集合,则可以避免跨 Install 和 Uninstall 方法维护集合。调用安装实用工具时,它会查找 RunInstallerAttribute 属性。 如果 属性为 true
,则实用工具将安装已添加到集合的所有服务, Installers 这些服务与项目安装程序相关联。 如果 RunInstallerAttribute 为 false
或 不存在,则安装实用工具将忽略项目安装程序。
ServiceProcessInstaller与项目安装类关联的 将安装项目中所有ServiceInstaller实例通用的信息。 如果此服务具有将其与安装项目中其他服务分开的任何内容,则通过此方法安装该服务特定的信息。
注意
与派生自 ServiceBase的类的 相同ServiceBase.ServiceName至关重要ServiceName。 通常,服务的 属性的值 ServiceBase.ServiceName 是在服务应用程序的可执行文件的 Main () 函数中设置的。 服务控制管理器使用 ServiceInstaller.ServiceName 属性来查找此可执行文件中的服务。
可以在 将 添加到项目安装程序的集合之前或之后修改 上的Installers其他属性ServiceInstaller。 例如,可以将服务的 StartType 设置为在重新启动时自动启动服务,或者要求用户手动启动该服务。
通常,不会在代码中调用方法 ServiceInstaller ;通常仅由安装实用工具调用。 安装实用工具在安装过程中自动调用 ServiceProcessInstaller.Install 和 ServiceInstaller.Install 方法。 如有必要,它会通过在以前安装的所有组件上调用 Rollback (或 ServiceInstaller.Rollback) 来备份失败。
安装实用工具调用 Uninstall 以删除 对象。
应用程序的安装例程使用项目安装程序 Installer.Context的 自动维护有关已安装组件的信息。 此状态信息作为 ServiceProcessInstaller 实例不断更新,每个 ServiceInstaller 实例都由 实用工具安装。 通常不需要代码显式修改状态信息。
执行安装时,它会自动创建 以 EventLogInstaller 安装与 ServiceBase 派生类关联的事件日志源。 Log此源的 属性由ServiceInstaller构造函数设置为计算机的应用程序日志。 设置 ServiceNameServiceInstaller (应与服务) 的 相同 ServiceBase.ServiceName 时, Source 会自动将 设置为相同的值。 在安装失败时,源的安装会连同以前安装的服务一起回滚。
如果服务正在运行,方法 Uninstall 会尝试停止该服务。 无论此操作是否成功, Uninstall 都会撤消 所做的更改 Install。 如果为事件日志记录创建了新源,则会删除该源。
构造函数
ServiceInstaller() |
初始化 ServiceInstaller 类的新实例。 |
属性
CanRaiseEvents |
获取一个指示组件是否可以引发事件的值。 (继承自 Component) |
Container |
获取包含 IContainer 的 Component。 (继承自 Component) |
Context |
获取或设置关于当前安装的信息。 (继承自 Installer) |
DelayedAutoStart |
获取或设置一个值,该值指示是否应延迟启动该服务,直到运行其他自动启动的服务。 |
Description |
获取或设置服务的说明。 |
DesignMode |
获取一个值,用以指示 Component 当前是否处于设计模式。 (继承自 Component) |
DisplayName |
指示向用户标识服务的友好名称。 |
Events |
获取附加到此 Component 的事件处理程序的列表。 (继承自 Component) |
HelpText |
获取安装程序集合中所有安装程序的帮助文字。 (继承自 Installer) |
Installers |
获取该安装程序包含的安装程序的集合。 (继承自 Installer) |
Parent |
获取或设置包含该安装程序所属的集合的安装程序。 (继承自 Installer) |
ServiceName |
指示系统用于标识此服务的名称。 此属性必须与要安装的服务的 ServiceName 相同。 |
ServicesDependedOn |
指示为使该服务能够运行而必须正在运行的服务。 |
Site | (继承自 Component) |
StartType |
指示启动此服务的方式和时间。 |
方法
事件
AfterInstall |
在 Installers 属性中的所有安装程序的 Install(IDictionary) 方法都运行后发生。 (继承自 Installer) |
AfterRollback |
在回滚 Installers 属性中所有安装程序的安装后发生。 (继承自 Installer) |
AfterUninstall |
在 Installers 属性中所有安装程序都执行它们的卸载操作后发生。 (继承自 Installer) |
BeforeInstall |
在安装程序集合中每个安装程序的 Install(IDictionary) 方法运行前发生。 (继承自 Installer) |
BeforeRollback |
在回滚 Installers 属性中的安装程序前发生。 (继承自 Installer) |
BeforeUninstall |
在 Installers 属性中的安装程序执行它们的卸载操作前发生。 (继承自 Installer) |
Committed |
在 Installers 属性中的所有安装程序均提交它们的安装后发生。 (继承自 Installer) |
Committing |
在 Installers 属性中的安装程序提交它们的安装前发生。 (继承自 Installer) |
Disposed |
在通过调用 Dispose() 方法释放组件时发生。 (继承自 Component) |