Служба Windows не запускает приложение WPF - PullRequest
1 голос
/ 30 сентября 2019

У меня есть приложение ASP.Net Core, которое работает как служба Windows. Его задача - проверять файлы на FTP-сервере, когда выполняется условие: запустить приложение WPF.

Приложение работает правильно во время тестов в отладчике. Когда он запускается как служба, он запускается, но не запускается WPF.

public class AplicationInstance: SingletonExtension<AplicationInstance>
    {

        public SessionOptions FTPSessionOptions { get; set; }
        public string FTPFingerprint { get; set; }

        public List<FileModel> CurrentFiles;
        public List<FileModel> OldFiles;
        public ObservableCollection<FileModel> DifrentFiles;

        private AplicationInstance()
        {
            CurrentFiles = new List<FileModel>();
            OldFiles = new List<FileModel>();
            DifrentFiles = new ObservableCollection<FileModel>();


            StartNewAplicationThread();
            Task.Delay(1000).Wait();
        }


        public Application app { get; set; }
        public void DispatchToApp(Action action)
        {
            app.Dispatcher.Invoke(action);
        }
        [STAThread]
        private void StartNewAplicationThread()
        {
            var appthread = new Thread(new ThreadStart(() =>
            {
                try
                {
                    app = new Application();
                    app.ShutdownMode = ShutdownMode.OnExplicitShutdown;

                    app.Run();
                }
                catch (Exception ex)
                {
                    var t = ex.Message; ;
                }
            }));
            appthread.SetApartmentState(ApartmentState.STA);
            appthread.Start();
            appthread.Name = "NSP Files -> All File Browser " + DateTime.Now;

        }
    }
 private static void StartWpfWindows()
        {
            WPFStartModel _newWPFApplication = new WPFStartModel();
            _newWPFApplication.Title = "xxx";
            _newWPFApplication.Files = AplicationInstance.Instance.CurrentFiles;


            AplicationInstance.Instance.DispatchToApp(() =>
            {

                appWindow = new WPFAplication.FileListWindow(_newWPFApplication);
                appWindow.Show();
            });
        }

РЕДАКТИРОВАТЬ (ответ на первые 2 комментария): проблема возникает во встроенной версии (выпускУ меня есть дополнительное приложение, которое добавляет новую службу Windows и запускает ее через CMD.

 public static async Task<string> ExecuteCommand(string command, int timeMiliseconds = 0)
        {
            try
            {

                System.Diagnostics.ProcessStartInfo procStartInfo =
                    new System.Diagnostics.ProcessStartInfo("cmd", "/c " + command);

                procStartInfo.RedirectStandardOutput = true;

                procStartInfo.UseShellExecute = false;
                procStartInfo.CreateNoWindow = false;
                procStartInfo.Verb = "runas";

                Console.WriteLine(command);
                System.Diagnostics.Process proc = new System.Diagnostics.Process();
                proc.StartInfo = procStartInfo;

                proc.Start();

                proc.WaitForExit();

                if (!proc.HasExited)
                {
                    if (timeMiliseconds != 0)
                        await Task.Delay(timeMiliseconds);
                    else
                        await Task.Delay(400);
                }

                string result = proc.StandardOutput.ReadToEnd();
                if (!string.IsNullOrEmpty(result))
                {
                    return result;
                }
                else return string.Empty;
            }
            catch (Exception objException)
            {
                Console.WriteLine("CMD EXCEPTION: " + objException.Message);
                return string.Empty;
            }
        }

Я использую команду:

                string _tmpCommand = "sc create " + ServiceName + " binPath= \"" + ServicePath + "\"";
//And
                string _tmpCommand = "sc start " + ServiceName;

Я создаю приложение с помощью этой команды: "dotnet publish -c Release -r win10-x64 "

...