2009-07-01 2 views
1

У меня есть приложение WinForms («WF») и библиотеки под названием этой WinForms приложения («LIB»)Доступ к параметрам (App.config) вызывающего приложения

WF имеет Settings.settings (Visual Studio Designer) и комьюнити app.config. Я собираюсь, чем дизайнер - это интерфейс, который автоматически создает файл app.config. Чтобы использовать эти параметры из WF, я использую строго типизированные свойства класса, который он автогенерирует (т. Е. WF.Settings.MyTimeOutSetting).

Когда WF вызывает метод в LIB, я хочу использовать один из параметров WF из lib. Как я могу получить параметр из app.config вызывающего (WF) приложения в коде Callle (LIB)?

ответ

4

Как сказал Джон, это плохая идея. Вызывающий (exe в этом случае) должен передать необходимую информацию в DLL. Таким образом, вы можете повторно использовать DLL позже, где-то еще, и не иметь некоторую «невидимую» зависимость от установки app.config.

Попробуйте это:

Dim oConfiguration As System.Configuration.Configuration 
oConfiguration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) 
Dim sValue As String = oConfiguration.AppSettings.Settings("setting").Value 
+0

Да, это тоже меня раздражает! – bbqchickenrobot

+0

Я не ответил, потому что я не думал, что ему понадобится много времени, чтобы найти неправильный способ сделать это. Я ответил через шесть минут после вопроса, и в этот момент он все еще мог подумать, что это хорошая идея. Теперь, когда он решил, что он не заботится о повторном использовании, нет причин для него не знать, как это сделать. –

+0

Ребята, не могли бы вы сразу ответить на что-то, что вызовет проблемы дальше по линии, или чтобы кто-нибудь спросил, что он спрашивает? Он не дал никаких указаний на то, что он никогда не назвал бы этот код другим абонентом и использовал термин «библиотека», что подразумевает повторное использование. Этот ответ отвечает на его вопрос, но ограничивает повторное использование. Кроме того, другие будут читать это, и я хочу убедиться, что они знают, почему нет. –

0

Так же, как и в окнах. Он будет атомарно смотреть в app.config вызывающего приложения сперва

+0

LIB не ссылается на WF. Поэтому он не знает об автогенерированном классе WF.Settings. – xyz

+0

вам может потребоваться добавить файл app.config в ваш bizlayer для целей компиляции/intellisense, но он не будет использовать его во время выполнения. Вы делаете то же самое для таких вещей, как SubSonic или EntityFramework. –

+0

Вот еще одна ссылка на аналогичный вопрос, но это может быть не совсем то, что вам нужно http://stackoverflow.com/questions/685259/getting-configuration-settings-from-web- config-app-config-using-class-library –

1

Добавить ссылку на System.Configuration для вашего projjct.

Тогда в частности .cs или .vb (или любой другой файл), вы желая сделать ссылку на конфигурационный файл добавить следующее:

C#: использование System.Configuration; VB: Импорт System.Configuration

, то вы можете получить доступ к веб-конфигурации, используя что-то вроде этого:

C#: System.Configuration.COnfigurationManager.AppSettings [ "THE_SETTING_U_WANT"];

VB: System.Configuration.COnfigurationManager.AppSettings («THE_SETTING_U_WANT»)

Если вы хотите полный раздел, я думаю, есть методы в этом классе, чтобы сделать это, как хорошо.

+0

Кажется, что это должно сработать, но AppSettings имеет Count = 0, и индекс возвращает null – xyz

+0

Это всегда очень хорошо работает для меня ... но это зависит от того, какая информация вы пытаясь получить. какие настройки вы пытаетесь извлечь из вашего app.config? если он находится в разделе выше, это не сработает. Вы также можете использовать GetSection(), или вы можете перенести информацию, которую хотите получить, в раздел , предполагая, что она соответствует парадигме ключа/значения. i.e. - Также, если вы пытаетесь получить строку соединения, вы можете попробовать: ConfigurationManager.ConnectionStrings ["NameOfConnStirng"]; – bbqchickenrobot

+0

Это может немного помочь вам: http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager_members.aspx – bbqchickenrobot

3

Ответ: не делайте этого.

Попросите вызывающее приложение передать вам все, что вам нужно знать в вызове или, возможно, в вашем конструкторе. Вызываемый компонент не должен требовать знания вызывающего.

+0

Это не требуется - это просто полезно. Бьюсь об заклад, существует признанный способ сделать это. – xyz

+1

Признанный способ - не делать этого. Разделение проблем, компонентное развитие; эти вещи подразумевают, что вызывающий должен предоставить вызываемому то, что ему нужно. Таким образом, его можно вызвать в другом контексте. –

+0

Насколько я знаю, приложение в app.config означает AppDomain, и они находятся в том же AppDomain. Как я уже сказал, настройка не нужна, ее просто полезно использовать в качестве подсказки. – xyz

Смежные вопросы