Как мне отредактировать ConfigurationManager.App/ConnectionSettings, находясь в COM-объекте .Net, вызываемом веб-страницей asp-classic - PullRequest
0 голосов
/ 28 октября 2011

Я создаю экземпляр .NET COM-объекта и хотел бы обновить свойства ConfigurationManager.AppSettings и ConfigurationManager.ConnectionStrings .Я заметил, что, хотя у меня есть настройки в конфигурационном файле сборки, например, "ComLib.dll.config" , эти настройки недоступны во время выполнения.

Я звоню, чтобы создатьCOM-объект из классической веб-страницы ASP с использованием следующего:

Dim COMObject
Set COMObject = Server.CreateObject("COMAPI.COMObject")

Я использую отладчик VS2010, чтобы войти в конструктор моего COM-объекта .NET (COMAPI.COMObject).Именно здесь я проверяю ConfigurationManager , чтобы проверить, что загружено.

Оба "Assembly.GetExecutingAssembly" и "Assembly.GetCallingAssembly" имеют тот же результат, что и полный путь к "ComLib.dll" зарегистрированному местоположению сборки.Что я и ожидаю.В этом месте также находится файл "ComLib.dll.config" , который не загружается в ConfigurationManager .

Когда я пытаюсь очистить AppSettings с помощью следующей команды возникает исключение:

ConfigurationManager.AppSettings.Clear();

Исключение составляет: "Объект сервера: 006 ~ ASP 0177 ~ Server.CreateObject Failed ~ 80131902"

Я думаю, что вышеупомянутое исключение - это интерпретация ASP Classic приложения "AppSettings только для чтения", но я не уверен на 100%.

Что я перехожу, так это загрузка "ComLib.dll.config " file, а затем выполняется над каждым из элементов AppSettings , добавляя их в набор ConfigurationManager.AppSettings , но это также вызывает исключение: "Объект сервера: 006 ~ ASP 0177 ~ Server.CreateObject Failed ~ 80131902 ".

Код, который я использую в .NET COM Object, выглядит следующим образом:

Assembly comApiAssembly = Assembly.GetExecutingAssembly();
string comApiLocation = comApiAssembly.Location;
configuration = null;
configuration = ConfigurationManager.OpenExeConfiguration(comApiLocation);
var toLoadEnumberable = configuration.AppSettings.Settings.GetEnumerator();
while (toLoadEnumberable.MoveNext())
{
    var current = (KeyValueConfigurationElement)toLoadEnumberable.Current;
    ConfigurationManager.AppSettings.Add(current.Key, current.Value);
}

Мне нужна информация о конфигурации в ConfigurationManager , так как эта .NET COM LIBиспользуется для вызова других сборок .NET.Для других сборок .NET требуется настройка.

Заранее спасибо.

1 Ответ

2 голосов
/ 03 ноября 2011

Мне удалось получить помощь на форумах MSDN .

В основном вместо использования .Clear / .Add / .Remove в ConfigurationManager.AppSettings я получаю доступ к параметру, если он существует, и задаю значение для этого ключа:

ConfigurationManager.AppSettings["Key"] = "KeyValue";

Это обновляет ConfigurationManager.AppSettings. Это здорово, потому что, когда я обращаюсь к частям моего приложения, которые выходят за рамки первоначального вызова «ASP Classic» -> «COM API», я все еще могу получить настройки приложения из ConfigurationManager.

С учетом всего сказанного я до сих пор не знаю, как редактировать ConfigurationManager.ConnectionStrings.

Если я попытаюсь .Clear / .Add / .Удалить в ConnectionStrings и возникает исключение . Есть идеи по этому вопросу?

Я обновлю этот ответ, если найду дополнительную информацию.

В качестве обновления : Чтобы обойти настройки ConnectionString без моих настроек, я реализовал инфраструктуру IoC контейнера Unity. Я использую экземпляр Static для размещения контейнера IoC и таким образом разрешаю свои экземпляры.

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

...