gpt4 book ai didi

c# - Service Installer 类能否在不同的程序集中运行?

转载 作者:行者123 更新时间:2023-11-30 23:04:37 25 4
gpt4 key购买 nike

我有一个自定义安装程序类,用于安装我的 Windows 服务。去掉必要的细节,该类看起来像这样。

[RunInstaller(true)]
public class MyWindowsServiceInstaller : Installer
{
public MyWindowsServiceInstaller()
{
ServiceProcessInstaller processInstaller = new ServiceProcessInstaller();
ServiceInstaller serviceInstaller = new ServiceInstaller();

processInstaller.Account = ServiceAccount.LocalSystem;

serviceInstaller.DisplayName = Program.ServiceDetails.Name;
serviceInstaller.Description = Program.ServiceDetails.Description;

//Must be the same as what was set in Program's constructor
serviceInstaller.ServiceName = Program.ServiceDetails.Name;

Installers.Add(processInstaller);
Installers.Add(serviceInstaller);
}
}

然后通过调用以下类通过代码安装服务,具体取决于传递给服务的参数,就像这样。这是从 Main 内部调用的。

using (ServiceHandler serviceHandler = new ServiceHandler(program.ModuleName, typeof(Program).Assembly))
{
serviceHandler.InstallService();
}

ServiceHandler 类所在的位置(再次精简以消除噪音)。

public class ServiceHandler : IDisposable
{
private ServiceController _serviceController;
private AssemblyInstaller _assemblyInstaller;

public ServiceHandler(string serviceName, Assembly assembly)
{
_serviceController = new ServiceController(serviceName);

_assemblyInstaller = new AssemblyInstaller(assembly, null);
_assemblyInstaller.UseNewContext = true;
}

public void InstallService()
{
if (IsServiceInstalled())
{
return;
}

IDictionary state = new Hashtable();
try
{
_assemblyInstaller.Install(state);
_assemblyInstaller.Commit(state);
}
catch
{
try
{
_assemblyInstaller.Rollback(state);
}
catch { }
throw;
}
}

public bool IsServiceInstalled()
{
try
{
ServiceControllerStatus status = _serviceController.Status;
}
catch
{
return false;
}

return true;
}
}

但是,目前我们所有的服务都使用相同的 MyWindowsServiceInstaller,但分别复制到每个项目中。为了解决这个问题,我打算将该类移动到具有一些其他功能的通用程序集中(并删除该类与 Program 的耦合),但我不确定是否可以使用 Installer 在另一个程序集中。

这可能吗?如果是这样,我该怎么做?


我想我的方法的另一个问题是创建 ServiceHandlertypeof(Program).Assembly 调用,但我不确定。

最佳答案

安装程序查看程序集并查找 [RunInstaller(true)] 属性。只认为你应该做:安装程序女巫的标记是你的安装程序类。将继承的空类放入主程序集中。

通用程序集:

//[RunInstaller(true)] <<-- REMOVE this
public class MyWindowsServiceInstaller : Installer
{
public MyWindowsServiceInstaller(){
ServiceProcessInstaller processInstaller = new
ServiceProcessInstaller();
ServiceInstaller serviceInstaller = new ServiceInstaller();

processInstaller.Account = ServiceAccount.LocalSystem;

serviceInstaller.DisplayName = Program.ServiceDetails.Name;
serviceInstaller.Description = Program.ServiceDetails.Description;

//Must be the same as what was set in Program's constructor
serviceInstaller.ServiceName = Program.ServiceDetails.Name;

Installers.Add(processInstaller);
Installers.Add(serviceInstaller);
}
}

主要组件

[RunInstaller(true)] // <<-- put it here
public class ProjectInstaller : MyWindowsServiceInstaller { }

关于c# - Service Installer 类能否在不同的程序集中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49298429/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com