.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

Данные значения: правда

введите описание изображения здесь

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

Этот трюк все еще опрятен, хотя просто чтобы быстро что-то попробовать.