App.config для библиотеки dll
-
03-07-2019 - |
Вопрос
У нас есть "движок", который динамически загружает библиотеки DLL (все, что находится в определенном каталоге) и вызывает классы Workflow из них путем отражения.
Теперь у нас есть несколько новых рабочих процессов, требующих доступа к базе данных, поэтому я решил поместить конфигурационный файл в каталог dll.
Но по какой-то причине мои рабочие процессы просто не видят конфигурационный файл.
<configuration>
<appSettings>
<add key="ConnectString" value="Data Source=officeserver;Database=mydatabase;User ID=officeuser;Password=officeuser;" />
</appSettings>
</configuration>
Учитывая приведенный выше конфигурационный файл, следующий код выводит пустую строку:
Console.WriteLine(ConfigurationManager.AppSettings["ConnectString"]);
Я думаю, что я хочу просто указать имя файла конфигурации, но здесь у меня возникают проблемы.Я просто не получаю результатов.У кого-нибудь есть какие-нибудь указания?
Решение
Если ваш пример кода для чтения AppSettings находится в вашей библиотеке DLL, то он попытается прочитать конфигурационный файл для приложения, а не конфигурационный файл для библиотеки DLL.Это происходит потому, что вы используете Отражение для выполнения кода.
Другие советы
Забавно, там, где я нахожусь, мы делаем что-то очень похожее, и конфигурационный файл загружается просто отлично.В нашем случае я думаю, что имя каждого нового конфигурационного файла совпадает с именем связанной с ним сборки.Таким образом, у MyLibrary.dll был бы файл с именем MyLibrary.dll.config с информацией для этой файловой сборки.Кроме того, пример, который у меня есть под рукой, - это использование VB.Net, а не C # (у нас есть некоторые из них), и все настройки там предназначены для специфичного для VB пространства имен My.Settings, поэтому мы не используем класс ConfigurationManager напрямую для их чтения.
Сами настройки выглядят примерно так:
<applicationSettings>
<MyLibrary.My.MySettings>
<setting name="SomeSetting" serializeAs="String">
<value>12345</value>
</setting>
</MyLibrary.My.MySettings>
</applicationSettings>
Я написал это для аналогичной системы.Насколько я помню, я использовал Assembly.GetExecutingAssembly
чтобы получить путь к файлу библиотеки DLL, добавьте .config
к этому имени, загрузил его как XmlDocument
, перешел к <appSettings>
узел и передал это в NameValueSectionHandler
's Create
способ.
Вот один из способов - AppDomain.CurrentDomain.setData ("APP_CONFIG_FILE", "путь к конфигурационному файлу");
Вызовите конструктор.
Если я правильно помню, app.config будет загружен из каталога вашего приложения, поэтому, если вы загружаете библиотеки DLL из какого-либо другого каталога, вам понадобятся нужные им ключи в файле конфигурации вашего приложения.
Я не совсем уверен, но я думаю, что этот класс работает только с путем метода ввода AppDomain (путь к exe-файлу большую часть времени) по умолчанию.Сначала вам нужно вызвать OpenExeConfiguration(string exePath) (Framework 2.0 и более поздние версии), чтобы указать на другой конфигурационный файл.