Как я могу сделать библиотеку классов .NET, прочитав ее собственный файл конфигурации?

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

К сожалению,.NET не дает возможности легко прочитать файл DLL app.config. Единственным "простым" решением было бы сохранить строку подключения в каждом файле конфигурации веб-сервиса, который полностью блокируется.

Обычно я забочусь о элегантности кода, но на этот раз мне действительно нужно решение, даже если это взломать. Есть ли способ сделать библиотеку .NET классов собственной конфигурацией?


EDIT: Технически я мог объединить все эти веб-службы в одну веб-службу. Но по бизнес-причинам (каждый веб-сервис будет продаваться отдельно), я не могу этого сделать.

Ответы

Ответ 1

Я думаю, что вы ищете:

ConfigurationManager.OpenExeConfiguration(string exePath)

или

ConfigurationManager.OpenMappedExeConfiguration(
    new ExeConfigurationFileMap() { 
        ExeConfigFilename = path + "app.config" 
    }, ConfigurationUserLevel.None);

Возвращает объект Configuration. Документ MSDN в ConfigurationManager

Попробуйте этот вопрос о том, как получить путь к DLL.

Ответ 2

Из года в год я знаю, но я использовал этот метод для чтения каждого из параметров:

Configuration config = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
ConfigurationSectionGroup csg = config.GetSectionGroup("applicationSettings");
ClientSettingsSection c = (ClientSettingsSection)csg.Sections["Add your section name here, e.g. Your.Namespace.Properties.Settings"];
foreach (SettingElement e in c.Settings)
{
    Debug.WriteLine("SETTING NAME: " + e.Name);
    SettingValueElement v = e.Value;
    Debug.WriteLine("SETTING VALUE: " + v.ValueXml.InnerText);
}

Это работает с файлом настроек, созданным в проекте библиотеки классов. Файл настроек должен быть назван "YourLibrary.dll.config", а затем развернут в месте расположения библиотеки. Файл настроек должен иметь схожий контент:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="Your.NameSpace.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
    </sectionGroup>
  </configSections>
  <applicationSettings>
    <Your.NameSpace.Properties.Settings>
      <setting name="YourLibrary_WebReferences_YourWebService" serializeAs="String">
        <value>http://localhost:3861/YourWebService.asmx</value>
      </setting>
      <setting name="AnotherSetting" serializeAs="String">
        <value>False</value>
      </setting>
    </Your.NameSpace.Properties.Settings>
  </applicationSettings>
  <startup>
    <supportedRuntime version="v2.0.50727"/>
  </startup>
</configuration>

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

Причина, по которой мне нужно было сделать это, это то, что у меня есть User Control, который обертывает библиотеку ActiveX/COM, которая затем размещается в IE в теге "object". Я использую теги "param", поэтому я мог использовать этот механизм для передачи настроек в User Control, но этот метод казался логичным выбором в то время. Плюс я не собирался позволять этой конкретной проблеме бить меня!

HTH pridmorej:)

Ответ 3

Такая проблема конфигурации решена довольно хорошо, используя Корпоративная библиотека " Источники общей конфигурации" и " Дифференциальные конфигурации" (для удобства переключения между несколькими средами и т.д.).

Чтобы узнать о Сценарии расширенной конфигурации, попробуйте начать здесь:

http://msdn.microsoft.com/en-us/library/ff664552 (v = pandp.50).aspx

Чтобы интегрировать Инструмент настройки корпоративной библиотеки (GUI) в Visual Studio, попробуйте здесь:

http://visualstudiogallery.msdn.microsoft.com/029292f0-6e66-424f-8381-3454c8222f9a

Кривая обучения может показаться немного подавляющей вначале, но она стоит того, что особенно важно, особенно если вы имеете дело с сложными экосистемами предприятия. Интегрированный инструмент фактически упрощает настройку очень сложной системы конфигурации и управляет им по мере изменения ваших требований.

BTW: Как только вы его повесите, вы, вероятно, в конечном итоге захотите использовать его намного больше, чем просто ваши строки подключения!

Ответ 4

ConfigurationManager.OpenExeConfiguration не работает для меня.

Но Properties.Settings.Default.<SettingName> работал хорошо.

Ответ 5

Можно ли ссылаться на файл конфигурации библиотеки из каждой конфигурации веб-службы? В .NET есть механизм включения XML-типа:

Использование XML включает ссылки или ссылки конфигурации в app.config для включения других настроек файлов конфигурации

http://blog.andreloker.de/post/2008/06/Keep-your-config-clean-with-external-config-files.aspx

В то время как вам все равно нужно редактировать каждый web.config, фактическое содержимое поддерживается в одном месте.

Ответ 6

Вы можете использовать библиотеку Config.Net с открытым исходным кодом, которая поддерживает несколько источников данных, включая ваш https://github.com/aloneguid/config

Ответ 7

Вы можете прочитать настройки конфигурации библиотеки классов из приложения-хоста web.config или app.config.

Если библиотека классов указана в консольном приложении, поместите параметры, библиотеку классов, в app.config консольного приложения (скажем, в appSettings) и прочитайте его из библиотеки классов с помощью ConfigurationManager в System.Configuration.

Если библиотека классов указана в веб-приложении, поместите параметры, необходимые библиотеке классов в web.config веб-приложения (скажем, в appSettings), и прочитайте ее из библиотеки классов с помощью ConfigurationManager под System.Configuration.