Хобрук: Ваш путь к мастерству в программировании

XML-файл не может быть обнаружен после установки службы Windows

Я создал службу Windows. Я делаю настройку службы с помощью установщика Windows. У меня есть один файл XML, например файл конфигурации. Всякий раз, когда я отлаживаю службу Windows с присоединением проекта отладки, он работает нормально. Но после установки я вижу событие, говорящее о том, что не удалось найти файл example.xml в C:\Windows\system32. Это повторяющаяся проблема. Может ли кто-нибудь сказать мне, что происходит с этим. Или какие-либо предложения?


Ответы:


1

Это не проблема установщика. Службы Windows всегда запускаются с System32 в качестве текущего каталога. Добавьте эту строку в метод Main() в файле Program.cs перед запуском каких-либо служб.

    Environment.CurrentDirectory = new FileInfo(Assembly.GetExecutingAssembly().FullName).DirectoryName;
14.03.2013
  • +1: возможный подход, также я бы рекомендовал подход @spender (тоже +1) для явного вычисления пути к файлу конфигурации вместо того, чтобы полагаться на текущую папку (даже если вы установите его - какой-то другой фрагмент кода может изменить его, и загрузка будет снова разбить еще более запутанным образом). 15.03.2013
  • Причина, по которой я предлагаю этот подход, заключается в том, что если автор не понимает этого поведения, у него, вероятно, будут другие зависимости ниже по течению. 15.03.2013

  • 2

    Скорее всего, файл просто находится не там, где вы его ищете.

    Скорее всего, ваш код выглядит в «текущей рабочей папке», которая во время отладки в VS совпадает с приложением, но в случае запуска в качестве службы/из командной строки отличается.

    Убедитесь, что ваш код загружает файл из ожидаемого местоположения файла (т. е. рядом с приложением), а не из какого-либо относительного пути (например, «myfile.xml»).

    14.03.2013
  • Я попытался сделать это, я скопировал xml в каталог установки, но проблема та же. Есть ли способ заставить программу установки скопировать файл xml в папку system32? 15.03.2013
  • Копирование XML в System32 не рекомендуется. В коде службы вам нужно использовать отражение, чтобы получить расположение работающей сборки. Преобразуйте это в полное имя каталога и выполните Path.Combine(), чтобы получить правильное расположение файла XML. 15.03.2013

  • 3

    Почему вы сохраняете вещи в папках Windows? Если для этого нет действительно веской причины, это плохо. Установите свою конфигурацию в том же месте, где запущено ваше приложение, и получите путь к файлу с помощью:

    var folderPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    var configPath = Path.Combine(folderPath, configFileName);
    
    14.03.2013
  • Directory.SetCurrentDirectory(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)); ConfigurationPath = @config_file.xml; использование этого сработало для меня, спасибо ... я понял вашу идею. 15.03.2013
  • @nzdev, пожалуйста, проголосуйте за решение Кристофера Пейнтера, которое вы, по сути, использовали ... 15.03.2013
  • Как вы это сделаете, мне все равно. Важно понимать, что службы Windows запускаются в System32. 15.03.2013

  • 4

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

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

    14.03.2013
  • Это не совсем правильно. Большая часть system32 может быть прочитана не администраторами. 15.03.2013
  • Новые материалы

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

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

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

    Обзор 20 основных и современных методов работы с массивами в JavaScript
    Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

    Да, но я чувствую необходимость указать, что это или не единственные два.
    Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.