Запуск приложения Click Once - файл не найден - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть базовая служба, которая будет использоваться для запуска приложения ClickOnce каждые x минут, однако, когда я запускаю Process.Start (), я получаю исключение, что файл не может быть найден.

Код

        private void OnElapsedTime(object source, ElapsedEventArgs e)
    {
        WriteToFile("Timer ticked");
        CheckProcess(GetProcessName());
    }

    public void CheckProcess(string ProcessName)
    {

        WriteToFile(ProcessName);

        try
        {
            Process.Start(ProcessName);
            WriteToFile("It ran");
        }
        catch (Exception ex)
        {
            WriteToFile(ex.ToString());
        }

    }

    public string GetProcessName()
    {
        string ProcessName = string.Concat("%AppData%\\Microsoft\\Windows\\Start Menu\\Programs\\", PublisherName, "\\", ProductName, ".appref-ms");
        return ProcessName;
    }

Ошибка, которую я получаю:

%AppData%\Microsoft\Windows\Start Menu\Programs\PubName\ProdName.appref-ms
System.ComponentModel.Win32Exception (0x80004005): The system cannot find the file specified
   at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
   at System.Diagnostics.Process.Start()
   at System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
   at System.Diagnostics.Process.Start(String fileName)

Если я запускаю имя процесса, полученное в проводнике, приложение успешно запускается.Значение ProcessName:

C: \ Users \ xxx \ AppData \ Roaming \ Microsoft \ Windows \ Меню Пуск \ Программы \ PubName \ ProdName.appref-ms

Есть что-то, чего мне не хватаетчтобы запустить файл?

1 Ответ

0 голосов
/ 30 сентября 2018

Службы Windows - это программы, которые запускаются еще до того, как пользователь вошел в свою учетную запись.Это цель службы Windows, и по этому определению у вас нет доступа к определенным переменным среды пользователя (например,% AppData%), поскольку вы не находитесь в сеансе пользователя , поэтому ваш адрес будет преобразован во что-то Нечетный Если вы напишите его в .txt, вы увидите результат.

Службы Windows (по вашим определениям) будут запускаться с помощью LocalSystem, LocalService или NetworkService.Перейдите в TaskManager-> Services-> Open Services и посмотрите Log On As Столбец.

Таким образом, вы должны использовать общий путь, который будет доступен через ваш сервис.

Самое ужасное решение - заставить вашу Службу дождаться входа пользователя в систему и выдать себя за его токен.

Я предпочту выбрать лучшее место.

Существует способ отладки и просмотра ошибок в вашей службе (в UserSession ) в VisualStudio.Измените ваш Program.cs на что-то вроде:

static void Main()
{
#if DEBUG
        var MainService = new MainService();
        MainService.OnDebug();

#else

        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[]
        {
            new MainService()
        };
        ServiceBase.Run(ServicesToRun);
#endif
}

и добавьте функцию OnDebug к вашей службе:

 public void OnDebug()
 {
    OnStart(null);
 }

, если вы отладите свой проект таким образом, вы увидите, что ваша служба работаетработает как ожидалось !!!

...