Проблема с загрузкой сборки через Reflection и доступ к конфигурации - PullRequest
3 голосов
/ 28 июля 2010

Я пытаюсь загрузить сборку .NET с помощью Reflection (используя метод Assembly.LoadFrom) и создать экземпляры некоторых типов внутри этой сборки.

Кажется, все это работает нормально, но один тип, который я пытаюсь создать, обращается к конфигурации сборки в инициализаторе типов: он делает ConfigurationManager.GetSection(sectionName). Затем сборка вызывает исключение, поскольку раздел конфигурации не найден.

Файл конфигурации для сборки, которую я загружаю, находится в том же каталоге и имеет стандартное имя (т.е. AssemblyName.dll.config), и в конфигурации определенно есть запрашиваемый раздел. Почему нельзя найти раздел конфигурации? Есть ли что-то дополнительное, что мне нужно сделать при загрузке сборки?

Ответы [ 2 ]

6 голосов
/ 28 июля 2010

Поскольку читаемый файл конфигурации является файлом конфигурации исполняемого файла хоста.Так, например, если вы запускаете код из Foo.exe, ваш файл конфигурации должен называться Foo.exe.config.AssemblyName.dll.config никогда не используется.Если вы запускаете это на веб-сайте, вы должны использовать web.config.

. Вы можете попробовать использовать метод OpenMappedExeConfiguration :

var configFileMap = new ExeConfigurationFileMap();
configFileMap.ExeConfigFilename = "AssemblyName.dll.config";
var section = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None).GetSection(sectionName);
1 голос
/ 04 февраля 2011

Следующий файл сопоставляется, а затем открывается как переменная System.Configuration:

string FilePath = System.Reflection.Assembly.GetAssembly(typeof(EncryptDecryptViewModel)).Location 
FilePath += @".config";                
var ConfigFileMap = new ExeConfigurationFileMap();
ConfigFileMap.ExeConfigFilename = FilePath;
Configuration LocalConfigurationManager = ConfigurationManager.OpenMappedExeConfiguration(ConfigFileMap, ConfigurationUserLevel.None);

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

При использовании System.Configuration.ConfigurationManager следующее будет допустимым и вернет значение:

string s = System.Configuration.ConfigurationManager.AppSettings["SomeSetting"];

Однако при использовании переменной Configuration LocalConfigurationManager (из приведенного выше кода) вызов аналогичен обычному вызову ConfigurationManager, например:

string s = LocalConfigurationManager.AppSettings["ConfigurationSections"];

Вы получите следующую ошибку при попытке запустить код:

'System.Configuration.ConfigurationElement.this [System.Configuration.ConfigurationProperty]' является недоступен из-за уровня защиты

Это потому, что в ConfigurationManager свойство AppSettings является NameValueCollection. В переменной Configuration AppSettings фактически является System.Configuration.AppSettingsSection, который содержит свойство с именем Settings, которое представляет собой KeyValueConfigurationCollection, поэтому для доступа к свойству вызов будет выглядеть следующим образом:

string s = LocalConfigurationManager.AppSettings.Settings["SomeSetting"].Value;

Для разделов строк соединения будет использоваться следующий синтаксис

string ConnectionString =  LocalConfigurationManager.ConnectionStrings.ConnectionStrings["connectionStringName"].ConnectionString;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...