.Net 4.6 AppContextSwitchOverrides не устанавливает переключатели, объявленные в config
Я пытаюсь установить переключатель совместимости "Switch.System.Xml.IgnoreEmptyKeySequences" из записи в файле app.config(или web.config), но переопределение, похоже, игнорируется.
Чтобы удалить возможность какой-либо странной конфигурации моего существующего проекта, я создал совершенно новый проект .Net 4.6 Web Forms (и связанный с ним тестовый проект) в VS2015.
Я следую указаниям microsoft для коммутаторов AppContext
https://msdn.microsoft.com/en-us/library/mt298997(v=vs.110).aspx и
https://msdn.microsoft.com/en-us/library/mt270286(v=vs.110).aspx
Файл app.config выглядит следующим образом:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Xml.IgnoreEmptyKeySequences=true"/>
</runtime>
</configuration>
Код, который я использую для чтения значения:
bool valueWasFound;
bool valueFromContext;
string switchString = "Switch.System.Xml.IgnoreEmptyKeySequences";
valueWasFound = AppContext.TryGetSwitch(switchString, out valueFromContext);
И все же я последовательно получаю false
для valueWasFound
и valueFromContext
.
Я пробовал это с другими значениями переключателей с тем же результатом.
Я нахожу, что если я установил переключатель в код, используя
AppContext.SetSwitch("Switch.System.Xml.IgnoreEmptyKeySequences", true);
Затем переключатель устанавливается как ожидаемый (т.е. я получаю true
для valueWasFound
и valueFromContext
).
Но я бы очень хотел установить это в App.Config/web.config
Любые идеи о том, как я получаю это, будут очень благодарны.
Ответы
Ответ 1
Вы должны модифицировать App.config в своем браузере решений. Этот файл будет переименован в файл YourAppName.exe.config и должен находиться в папке ваших двоичных файлов. Удаление или переименование этого файла приведет к тому, что переопределение этого переключателя не будет иметь эффекта. (Вы можете добавить этот файл вручную после его создания)
Я считаю, что вы должны положить App.config рядом с вашим exe вручную, у которого будет неправильное имя.
Ответ 2
Я наблюдал подобное поведение со следующей настройкой в .Net framework 4.6.2 <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=true"/>
Странно было то, что он менял поведение при нормальной работе, но терпел неудачу, когда мы пытались запустить UTC.
Ответ 3
Альтернативой является добавление переключателя в реестр. Кажется, он работает.
Документация MSDN:
Добавив строковое значение, имя которого является именем коммутатора в ключ HKLM\SOFTWARE\Microsoft.NETFramework\AppContext в реестре. Его значение должно быть строковым представлением булева, которое может быть проанализировано с помощью метода Boolean.Parse; то есть должны быть "Истина", "Истина", "Ложно" или "ложь". Если среда выполнения встречает какое-либо другое значение, она игнорирует переключатель.
В моем случае я сделал это
Имя значения: Switch.System.IdentityModel.DisableMultipleDNSEntriesInSANCertificate
Данные значения:
правда
![введите описание изображения здесь]()
Недостатком является то, что он применяется ко всем приложениям на машине.
В моей книге параметры реестра еще менее предпочтительны, чем что-то жестко закодированное в коде, поэтому я буду придерживаться программного подхода.
Этот трюк все еще опрятен, хотя просто чтобы быстро что-то попробовать.