Использование CurrentDomain.SetData(APP_CONFIG_FILE) не работает в PowerShell ISE

Я пытаюсь использовать сборку .NET 4.0 в PowerShell ISE и пытаюсь изменить файл конфигурации, который используется через:

[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $PathToConfig);    

[Configuration.ConfigurationManager]::ConnectionStrings.Count всегда возвращает «1»,
и «[Configuration.ConfigurationManager]::ConnectionStrings[0].Name» всегда возвращает «LocalSqlServer», и это имя ConnectionString отсутствует в моем файл ".config".

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


person NightShovel    schedule 16.11.2012    source источник


Ответы (2)


Это связано с тем, что путь к app.config для PowerShell ISE уже загружен и кэширован, поэтому последующее изменение пути app.config не будет иметь значения: stackoverflow.com/q/6150644/222748

Вот пример скрипта, который очистит кешированный путь, чтобы он работал в PowerShell ISE:

[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $PathToConfig)
Add-Type -AssemblyName System.Configuration
[Configuration.ConfigurationManager].GetField("s_initState", "NonPublic, Static").SetValue($null, 0)
[Configuration.ConfigurationManager].GetField("s_configSystem", "NonPublic, Static").SetValue($null, $null)
([Configuration.ConfigurationManager].Assembly.GetTypes() | where {$_.FullName -eq "System.Configuration.ClientConfigPaths"})[0].GetField("s_current", "NonPublic, Static").SetValue($null, $null)
[Configuration.ConfigurationManager]::ConnectionStrings[0].Name
person Michael    schedule 14.03.2013
comment
Это сработало для меня. У меня также была такая же проблема с использованием обычной оболочки и ISE. - person rikkit; 08.02.2016
comment
Работает и для меня. Последняя строка — это всего лишь пример того, что вы можете сделать после того, как правильно исправите APP_CONFIG_FILE. - person Jon Newman; 10.05.2019
comment
К сожалению, это не работает для меня с PowerShell 7 и Windows 10. Точный пример сценария скопирован и вставлен в файл ps1 и запущен из консоли Powershell, где $PathToConfig указывает на файл mycode.dll.config, по-прежнему возвращает LocalSqlServer в качестве строки подключения. а не тот, что в моем конфигурационном файле. Файл mycode.dll.config действителен и правильно читается dll при запуске в другом месте. Возможно ли, что PowerShell 7 сломал это? Попробую найти более раннюю версию. - person Steven Palmer; 17.06.2020

Снятие [0] работает для меня.

([Configuration.ConfigurationManager].Assembly.GetTypes() | where {$_.FullName -eq "System.Configuration.ClientConfigPaths"}).GetField("s_current", "NonPublic, Static").SetValue($null, $null)

person icoxfog417    schedule 28.05.2014