将一次性字符串值从winforms桌面应用程序发送到Windows服务的最简单方法

klsxnrf1  于 2022-12-04  发布在  Windows
关注(0)|答案(2)|浏览(114)

每次我的windows forms桌面应用程序启动时,我都需要它向同一台电脑上的windows服务发送一个一次性的string值。在大多数情况下,即使桌面应用程序没有运行,服务也会一直运行。但桌面应用程序会检查并在必要时启动服务。
什么是最简单/最好的机制来简单通信的单一字符串在桌面应用程序启动到windows服务?我不知道如何通信与windows服务的工作原理。
有没有这样做的简单例子?

bogh5gae

bogh5gae1#

Window服务是从ServiceBase派生的类。此基类允许服务代码重写OnCustomCommand方法。
例如,您可以在服务的主类中包含这样的内容

public enum ServiceCCommands
{ 
    ExecuteBackupNow = 128,
    DataLoader = 129
}
    
public partial class BackupService : ServiceBase
{
    .....

    protected override void OnCustomCommand(int command)
    {
        if (Enum.IsDefined(typeof(ServiceCCommands), command))
        {
            ServiceCCommands cmd = (ServiceCCommands)command;
            switch (cmd)
            {
                case ServiceCCommands.ExecuteBackupNow:
                    _logger.Info($"BackupService: Executing backup");
                    RunBackup();
                    break;
                case ServiceCCommands.DataLoader:
                    _logger.Info($"BackupService: Executing loader");
                    LoadData();
                    break;
            }
        }
        else
            _logger.Error($"BackupService: Custom Command not recognized={command}");
    }

现在,UI代码可以在使用System.ServiceProcess命名空间从ServiceController类获取服务示例后调用此CustomCommand

private void cmdRunBackup_Click(object sender, EventArgs e)
{
    try
    {
        const int ExecuteBackupNow = 128;
        var service = new ServiceController("yourServiceNameHere");
        if (service != null)
        {
            service.ExecuteCommand(ExecuteBackupNow);
            msgUtil.Information("Started backup command!");
        }
        else
            msgUtil.Failure("The service is not available!");
    }
    catch (Exception ex)
    {
        _logger.Error(......);
    }

} // end class

但是,据我所知,没有办法将字符串传递给这个方法,但当然可以将字符串存储在磁盘文件的某个地方,然后触发服务上的相应命令来读取字符串或其他需要传递的参数。
如果需要更复杂的上下文,您可以始终使用host a WCF service inside the Windows Service itself。这是一个更复杂的解决方案,我建议您将所需的工作量与基于简单文件的解决方案进行比较。

mrwjdhj3

mrwjdhj32#

我目前正在做的工作是让我的桌面应用程序使用以下命令将字符串值写入CommonApplicationData特殊文件夹中的文件:

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)

然后,我的Windows服务使用相同的方法查找该文件及其值。
CommonApplicationData是一个目录,用作所有用户(包括SYSTEM帐户)使用的应用程序特定数据的公共存储库。
如需详细信息,请参阅Environment.GetFolderPath MethodEnvironment.SpecialFolder中的CommonApplicationData。

相关问题