0

Я пользуюсь службой Windows и формой Windows. Я пытаюсь отправить пользовательские команды в службу, чтобы создать изолированный файл хранилища. Однако, когда я нажимаю мой «btnSubmit», файл не создается. По какой-то причине это не похоже, чтобы выполнить командуКак отправить пользовательские команды в службу C#

код в форме

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.ServiceProcess; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using Project2Service; 

namespace Project2 
{ 
    public partial class Form1 : Form 
    { 
     public Service1 s = new Service1(); 
     public ServiceInstaller si = new ServiceInstaller(); 
     public ProjectInstaller pi = new ProjectInstaller(); 
     public ServiceController sc = new ServiceController("Project2Service"); 

    private string[] isoType; 

    string machineName = System.Windows.Forms.SystemInformation.ComputerName; 

    public Form1() 
    { 
     InitializeComponent(); 

     isoType = new string[] { "User", "Assembly And Domain"}; 
     cboIsoType.Items.AddRange(isoType); 

     cboIsoType.SelectedIndex = 0; 

     btnContinue.Enabled = false; 
     btnPause.Enabled = false; 
     btnStop.Enabled = false; 
    } 

    public void Labels() 
    { 
     lblMachine.Text = machineName; 
     lblSName.Text = s.ServiceName; 
     lblSType.Text = si.StartType.ToString(); 

     lblSStatus.Text = sc.Status.ToString(); 
     lblPause.Text = sc.CanPauseAndContinue.ToString(); 
     lblShutdown.Text = sc.CanShutdown.ToString(); 
     lblStop.Text = sc.CanStop.ToString(); 
    } 

    private void btnStart_Click(object sender, EventArgs e) 
    { 
     //Controller.Refresh(); //Gets the current status of service 
     //if (Controller.Status == ServiceControllerStatus.Stopped) 
     //{ 
     // Controller.Start(); 
     //} 

     sc.Start(); 
     sc.WaitForStatus(ServiceControllerStatus.Running); 
     Labels(); 

     btnStart.Enabled = false; 
     btnContinue.Enabled = false; 
     btnStop.Enabled = true; 
     btnPause.Enabled = true; 

    } 

    private void btnStop_Click(object sender, EventArgs e) 
    { 
     sc.Stop(); 
     sc.WaitForStatus(ServiceControllerStatus.Stopped); 
     Labels(); 

     btnStart.Enabled = true; 
     btnContinue.Enabled = false; 
     btnPause.Enabled = false; 
     btnStop.Enabled = false; 
    } 

    private void btnPause_Click(object sender, EventArgs e) 
    { 
     sc.Pause(); 
     sc.WaitForStatus(ServiceControllerStatus.Paused); 
     Labels(); 

     btnPause.Enabled = false; 
     btnContinue.Enabled = true; 
     btnStart.Enabled = false; 
     btnStop.Enabled = true; 
    } 

    private void btnContinue_Click(object sender, EventArgs e) 
    { 
     sc.Continue(); 
     sc.WaitForStatus(ServiceControllerStatus.Running); 
     Labels(); 

     btnStop.Enabled = true; 
     btnStart.Enabled = false; 
     btnPause.Enabled = true; 
     btnContinue.Enabled = false; 
    } 

    private void btnSubmit_Click(object sender, EventArgs e) 
    { 
     if (cboIsoType.SelectedItem.ToString() == "User") 
     { 

      sc.ExecuteCommand(128); 
     } 
    } 
} 

}

Моя_служба Контроллер

 public enum ServiceCustomCommands { Command1 = 128, Command2 = 129 }; 
    //private IsolatedStorageScope iso; 

    public Service1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 

     //iso = IsolatedStorageScope.User | IsolatedStorageScope.Domain; 
     FileSystemWatcher Watcher = new FileSystemWatcher(@"C:\Users\Martin\Desktop\Project2\ServiceTest"); 
     Watcher.EnableRaisingEvents = true; 
     Watcher.NotifyFilter = NotifyFilters.LastAccess 
        | NotifyFilters.LastWrite 
        | NotifyFilters.FileName 
        | NotifyFilters.DirectoryName; 

     Watcher.Changed += new FileSystemEventHandler(Watcher_Changed); 
     Watcher.Created += new FileSystemEventHandler(Watcher_Created); 
     Watcher.Deleted += new FileSystemEventHandler(Watcher_Deleted); 
     Watcher.Renamed += new RenamedEventHandler(Watcher_Renamed); 
     WriteServiceInfo("Service Started!"); 
    } 

    // This event is raised when a file is changed 
    private void Watcher_Changed(object sender, FileSystemEventArgs e) 
    { 
     WriteServiceInfo("File Changed!"); 

     DirectoryInfo d = new DirectoryInfo(@"C:\Users\Martin\Desktop\Project2\ServiceTest");//Assuming Watch is your Folder 
     FileInfo[] Files = d.GetFiles("*.txt"); //Getting Text files 
     string str = ""; 
     foreach (FileInfo file in Files) 
     { 
      str = str + ", " + file.Name; 
      str = str + ", " + file.LastWriteTime; 
      str = str + ", " + file.CreationTime; 
      str = str + ", " + file.Length; 

      WriteServiceInfo(file.Name); 
      WriteServiceInfo(file.LastWriteTime.ToString()); 
      WriteServiceInfo(file.CreationTime.ToString()); 
      WriteServiceInfo(file.Length.ToString()); 
     } 
    } 

    private void Watcher_Created(object sender, FileSystemEventArgs e) 
    { 
     WriteServiceInfo("File Created!"); 
    } 

    private void Watcher_Deleted(object sender, FileSystemEventArgs e) 
    { 
     WriteServiceInfo("File Deleted!"); 
    } 
    private void Watcher_Renamed(object sender, FileSystemEventArgs e) 
    { 
     WriteServiceInfo("File Renamed!"); 
    } 

    private void WriteServiceInfo(string info) 
    { 
     FileStream fs = new FileStream(@"C:\Users\Martin\Desktop\Project2\WindowsServiceLog.txt", 
          FileMode.OpenOrCreate, FileAccess.Write); 
     StreamWriter m_streamWriter = new StreamWriter(fs); 
     m_streamWriter.BaseStream.Seek(0, SeekOrigin.End); 
     m_streamWriter.WriteLine(info + "\n"); 
     m_streamWriter.Flush(); 
     m_streamWriter.Close(); 
    } 


protected override void OnCustomCommand(int command) 
{ 
    switch ((ServiceCustomCommands)command) 
    { 
     case ServiceCustomCommands.Command1: 
      //Command1 Implementation 
      IsolatedStorageFile isoFile = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Domain | IsolatedStorageScope.Assembly, null, null); 
      IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream("LaptopInfo.txt", FileMode.Append, FileAccess.Write, isoFile); 

      using (StreamWriter writer = new StreamWriter(isoStream)) 
      { 
       writer.WriteLine("Data"); 
      } 

      //iso = IsolatedStorageScope.User; 
      break; 
     case ServiceCustomCommands.Command2: 
      //iso = IsolatedStorageScope.User | IsolatedStorageScope.Assembly; 
      break; 
     default: 
      break; 
    } 
} 
+0

Вы подтвердили, что ServiceController правильно подключен в вашей форме? Когда вы обновляете sc, действительно ли статус говорит, что служба запущена? Также вы подтвердили, что правильное значение кода принимается в 'OnCustomCommand' (либо через файл журнала, либо путем подключения к службе в отладчике)? –

+0

Вам нужно будет показать больше кода ... У вас есть служба Windows, развернутая на вашем локальном компьютере, и вы пытаетесь выполнить методы внутри нее из приложения форм Windows? Вы поставили точку останова в этом методе? Я собираюсь догадаться, что это не выполняется. Вам также необходимо предоставить полные методы и подписи, а не только фрагменты кода. – ragerory

+0

Обновлен метод 'OnCustomCommand' @ragerory anf tes, который моя служба запускает, и правильно подключена к форме @Nathan C –

ответ

0

Я думаю, вам нужно добавить ServieControllerPermission:

ServiceController sc = new ServiceController("YOURServiceName", Environment.MachineName); 
ServiceControllerPermission scp = new ServiceControllerPermission(ServiceControllerPermissionAccess.Control, Environment.MachineName, "YOURServiceName");//this will grant permission to access the Service 
scp.Assert(); 
sc.Refresh(); 

sc.ExecuteCommand((int)YourMethods.methodX);