Ответ 1
Если ваш образец кода для чтения AppSettings находится в вашей DLL, он попытается прочитать файл конфигурации для приложения, а не файл конфигурации для DLL. Это потому, что вы используете Reflection для выполнения кода.
У нас есть "движок", который динамически загружает dlls (все, что находится в определенном каталоге), и вызывает из них классы 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. Это потому, что вы используете Reflection для выполнения кода.
Забавно, где я нахожусь, мы делаем что-то очень похожее, и файл конфигурации загружается просто отлично. В нашем случае я думаю, что каждое новое имя файла конфигурации совпадает с именем соответствующей сборки. Итак, у MyLibrary.dll будет файл с именем MyLibrary.dll.config с информацией для этой сборки файла. Кроме того, в моем примере я использую VB.Net, а не С# (у нас есть некоторые из них), и все настройки там содержатся в пространстве имен My.Settings, специфичном для VB, поэтому мы не используем класс ConfigurationManager напрямую прочитайте их.
Настройки сами выглядят следующим образом:
<applicationSettings>
<MyLibrary.My.MySettings>
<setting name="SomeSetting" serializeAs="String">
<value>12345</value>
</setting>
</MyLibrary.My.MySettings>
</applicationSettings>
Я написал это для подобной системы. Мое воспоминание состоит в том, что я использовал Assembly.GetExecutingAssembly
, чтобы получить путь к файлу DLL, добавленный .config
к этому имени, загрузил его как XmlDocument
, перешел на <appSettings>
node и передал его в NameValueSectionHandler
Create
.
Вот один из способов - AppDomain.CurrentDomain.SetData( "APP_CONFIG_FILE", "путь к файлу конфигурации" );
Вызов конструктора.
Если я правильно помню, app.config будет загружен из вашего каталога приложений, поэтому, если вы загружаете DLL из другого каталога, вам понадобятся ключи, которые им нужны в вашем конфигурационном файле приложения.
Я не совсем уверен, но я думаю, что этот класс по умолчанию работает только с методом ввода метода AppDomain (путь к exe большую часть времени). Вы должны сначала вызвать OpenExeConfiguration (string exePath) (Framework 2.0 и более поздние), чтобы указать на другой файл конфигурации.