Как прочитать значения из App.config в .Net 4.0 с помощью ConfigurationManager? - PullRequest
7 голосов
/ 10 апреля 2011

Я создаю службу Windows в .Net 4.0 и тестирую некоторые функции указанной службы с помощью клиента форм Windows, ссылаясь на проект службы.

Проект службы имеет файл App.config, и этот файл выглядитнапример:

<?xml version="1.0" encoding="utf-8" ?>
  <configuration>
     <connectionStrings>
       <clear />
       <add name="myLocalMySQLDBUsername" connectionString="username"/>
     </connectionStrings>
  </configuration>

Когда вызывается функция, принадлежащая службе:

  • ConfigurationManager.ConnectionStrings ("myLocalMySQLDBUsername"). ConnectionString

aОшибка нулевой ссылки, потому что моя строка подключения не загружена.Единственные загружаемые строки подключения загружаются из файла machine.config, расположенного в каталоге c: \ WINDOWS \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \ machine.config

Если я создаю параметр области приложения дляСлужба, я могу получить эту настройку, используя My.Settings.setting ->, так что это не значит, что файл App.config не читается.

Мой вопрос: почему не используются мои строки подключениязагружен из файла App.config?

Спасибо за вашу помощь.

ОБНОВЛЕНИЕ:

Кроме того, на данный момент, дажеработа вокруг будет оценена;единственная причина использования app.config - возможность зашифровать содержимое с помощью DpapiProtectedConfigurationProvider (содержимое будет иметь некоторые значения имени пользователя / пароля для подключения к службе и базе данных).

Я пытался создать раздел AppSettings вручную вapp.config, но эти настройки также не были прочитаны ConfigurationManager (count = 0).

UPDATE 2:

В соответствии с предложением я попытался открыть вручнуюфайл app.config выглядит так:

Dim exePath As String = System.IO.Path.Combine(Environment.CurrentDirectory, "ServiceName.exe")

Dim myConfig As Configuration = ConfigurationManager.OpenExeConfiguration(exePath)

Итак, вот странная часть, когда я заглядываю внутрь, путь правильный (указывает на мой app.config), но строки подключения все еще загружаются с машиныФайл .config (мои строки подключения не загружены) !!ARGH

ОБНОВЛЕНИЕ 3:

Хорошо, так, я понял это.При ссылке на проект (родительский) из другого проекта (дочерний), дочерний app.config используется, даже если используются родительские классы.Таким образом, я могу получить connectionStrings для отображения, если я скопирую их в дочерний app.config.При попытке открыть его вручную, мой currentDirectory был дочерним, а не родительским (странно, как он не выдал исключение - он не смог бы найти файл конфигурации ... он просто молча использовал machine.config... Ну что ж).

Спасибо всем за помощь!

Ответы [ 4 ]

5 голосов
/ 10 апреля 2011

Первое, что вам нужно сделать, это убедиться, что учетная запись службы имеет доступ к файлу (если он не работает как SYSTEM).Похоже, что все должно быть в порядке, так как вы упоминаете, что My.Settings.Setting работает.

Другая вещь, на которую следует обратить внимание, это убедиться, что в app.config есть имя исполняемого файла службы -так что, если exe службы - MyService.exe, app.config должен называться MyService.exe.config.

Последнее, на что следует обратить внимание: библиотеки будут читать из исполняемого файла app.config, который загружает библиотеку,не app.config, который находится с библиотекой.Поэтому, если у вас есть проект для исполняемого файла службы MyService и проект для библиотеки MyServiceLibrary, код в библиотеке будет читать app.config из MyService, а не MyServiceLibrary.

2 голосов
/ 10 апреля 2011

Я видел, как некоторые люди говорят, что эту проблему можно решить, вручную добавив ссылку на System.Configuration.dll

СТОРОННОЕ ПРИМЕЧАНИЕ. Если это действительно весь файл app.config, а не просто фрагмент, тоэто ваша проблема ... ваш файл app.config должен быть НАМНОГО более сложным, иначе .NET не сможет его загрузить.

РАБОТАЕТ ВОПРОС: Используйте диспетчер конфигурации, чтобы открыть этот файл конфигурации (естьAPI для этого.) Вы не можете заставить его загружаться автоматически, просто скажите менеджеру конфигурации открыть его.

Я все еще думаю, что проблема в том, что ваш файл конфигурации недействителен - не могли бы вы опубликоватьПолный файл?

0 голосов
/ 23 февраля 2012

У меня была похожая проблема, но в моем случае это произошло потому, что я изменил пространство имен проекта.Это также используется в качестве имени элемента раздела настроек приложения в файле конфигурации, поэтому код не нашел новое имя раздела.Поигравшись с одним из значений пользовательской настройки в свойствах проекта и перестроив, новый раздел записался в app.config вместе со старыми, что и указывало на проблему для меня.

0 голосов
/ 10 апреля 2011

Убедитесь, что файл конфигурации развернут в той же папке, что и исполняемый файл, и что он называется your.assembly.exe.config .

...