Вопрос

У нас есть "движок", который динамически загружает библиотеки 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 и более поздние версии), чтобы указать на другой конфигурационный файл.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top