Запустить приложение Windows Forms как сервис?

  • System.in/out будет использовать набор символов Windows по умолчанию.
  • Java String будет использовать Юникод для внутреннего использования.
  • FileReader / FileWriter - это старые служебные классы, которые используют набор символов по умолчанию, поэтому они предназначены только для непереносимых локальных файлов.

Ошибка, которую вы видели, была специальным символом в виде двухбайтовой последовательности UTF-8, но каждый (специальный UTF-8) байт интерпретировался как однобайтовая кодировка по умолчанию, но с отсутствующим значением, следовательно, дважды ? замена.

  • Требуется, чтобы символ вводился в System.in в кодировке по умолчанию.
  • Затем строка была преобразована из кодировки по умолчанию.
  • Запись его в файл в UTF-8 должна указывать UTF-8.

Следовательно:

    BufferedReader stdinReader = new BufferedReader(new InputStreamReader(System.in));
    String[] stdinData = readLines(stdinReader);
    printToFile(stdinData, "stdin_out.txt");

    Path path = Paths.get("testinput-utf8.txt");
    List<String> lines = Files.readAllLines(path); // Here the default is UTF-8!

    Path path = Paths.get("testinput-winlatin1.txt");
    List<String> lines = Files.readAllLines(path, "Windows-1252");

    Files.write(lines, Paths.get("file_out.txt"), StandardCharsets.UTF_8);

Чтобы проверить, поддерживает ли ваша текущая компьютерная система японский язык:

System.out.println("Hiragana letter Wo '\u3092'."); // Either を or ?.

Видя ? преобразование в кодировку системы по умолчанию не смог доставить. を - это U + 3092, u-кодированный как ASCII с \ u3092.

Чтобы создать текст UTF-8 под Windows:

Files.write(Paths.get("out-utf8.txt"),
    "\uFEFFHiragana letter Wo '\u3092'.".getBytes(StandardCharsets.UTF_8));

Здесь я использую уродливый (обычно ненужный) маркерный символ спецификации \uFEFF (пробел нулевой ширины), который позволит блокноте Windows распознавать текст в UTF-8.

5
задан Matt Hamilton 12 March 2009 в 23:25
поделиться

7 ответов

(Этот ответ является устаревшим, так как связанная статья была удалена в 2012. Однако StackOverflow не позволяет принятому ответу быть удаленным. Так, любезно не делайте downvote этот ответ, так как я сообщил Вам, что это является устаревшим.)

Ссылка высокого звука: https://web.archive.org/web/20111221041348/http://www.codeproject.com/kb/system/xyntservice.aspx

Источник C++ (Или использование вкладка Browse Code на статье): https://web.archive.org/web/20111228050501/http://www.codeproject.com/KB/system/xyntservice.aspx

К сожалению, загрузка исходного кода zip-файла не работает в рамках альтернативных ссылок.

Запустите свои Windows-программы с сервиса NT

Проверьте эту статью: http://www.codeproject.com/script/Articles/ArticleVersion.aspx?aid=719&av=49654

Это - действительно старая статья, но это работало в течение 8 лет, и это продолжает совершенствоваться автором.

Это сделает то, что Вы хотите сделать.

8
ответ дан 18 December 2019 в 13:20
поделиться

Если Вы уверены, что приложение может работать необслуживаемый безопасно (этим, я подразумеваю, что оно никогда не может подбрасывать модальный элемент UI как Окно сообщения), и ему не нужно никакое взаимодействие до завершения работы, где оно будет просто завершено, то выполненный оно как запланированная задача с триггерным набором к системе запускает.

Если это может работать необслуживаемый, но это, возможно, должно быть завершением работы и перезапущенный вручную, или это не может только быть завершено на завершении работы, затем используют XYNTService, как рекомендуется EnocNRoll. Это - ужасный взлом, но это будет работать на то, что Вы хотите.

Но безусловно лучшее решение состоит в том, чтобы разделить функциональность Вашей программы от Пользовательского интерфейса и записать надлежащий сервис. И для рабочего сервера я не позволил бы ничто больше. Если не легко отделиться затем, у Вас есть некоторые вопросы проектирования, которые необходимо изучить так или иначе.

5
ответ дан 18 December 2019 в 13:20
поделиться

Можно запустить приложение winforms как услуга, Вы просто не сможете видеть его - это будет отображено на так называемом виртуальном рабочем столе, который не может быть просмотрен на Вашем мониторе.

1
ответ дан 18 December 2019 в 13:20
поделиться

Если у Вас есть хорошая отделенная функциональность в Вас приложение форм, это должно быть просто, чтобы создать класс обслуживания с его установщиком и затем запустить Ваш класс процессора в методе OnStart обслуживания:

    protected override void OnStart(string[] args)
    {
                    Processor processor = new Processor();
        Thread workerThread = new Thread(processor.OnStart);
        workerThread.IsBackground = true;

        try
        {
            workerThread.Start();
        }
        catch
        {
                      //...
        }
    }
0
ответ дан 18 December 2019 в 13:20
поделиться

Можно использовать InstallUtil для установки приложения как услуга, но необходимо удостовериться, что это не уверено в GUI, и я рекомендовал бы изменить запуск приложения, таким образом, это не пытается создать любые формы.

0
ответ дан 18 December 2019 в 13:20
поделиться

Единственный способ даже рассмотреть это состоит в том, чтобы удостовериться, что приложение не имеет никаких элементов UI к нему, когда необходимо перейти через обручи на машину не-Vista для создания этой работы, и на Vista, Вы не можете взаимодействовать с рабочим столом вообще.

Скорее Вы были бы лучшими от рефакторинга функциональности в ряд общих библиотек и затем создали бы сервис, который пользуется теми библиотеками, и установите это в клиенте.

0
ответ дан 18 December 2019 в 13:20
поделиться

Найденный этой статьей под названием то, Как Создать Пользовательский Сервис.

-1
ответ дан 18 December 2019 в 13:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: