.Net 4.6 AppContextSwitchOverrides不设置在config中声明的开关

时间:2015-09-14 14:26:45

标签: .net app-config .net-4.6

我正在尝试从app.config(或web.config)文件中的条目设置兼容性开关“Switch.System.Xml.IgnoreEmptyKeySequences”,但是覆盖似乎被忽略。 为了消除我现有项目的任何奇怪配置的可能性,我在VS2015中创建了一个全新的.Net 4.6 Web Forms项目(以及相关的测试项目)。

我正在关注AppContext交换机的微软指南 https://msdn.microsoft.com/en-us/library/mt298997(v=vs.110).aspxhttps://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);

然而,我falsevalueWasFound的{​​{1}}始终为valueFromContext

我已尝试使用其他开关值,结果相同。

我发现如果我使用

在代码中设置开关
AppContext.SetSwitch("Switch.System.Xml.IgnoreEmptyKeySequences", true);

然后按预期设置开关(即我truevalueWasFound valueFromContext。{/ p>

但我非常希望在App.Config / web.config

中设置它

我将非常感谢任何有关如何使其发挥作用的想法。

3 个答案:

答案 0 :(得分:1)

替代方法是将开关添加到注册表。它确实有效。

MSDN文档:

  

通过将名称为开关名称的字符串值添加到注册表中的HKLM \ SOFTWARE \ Microsoft.NETFramework \ AppContext键。它的值必须是布尔值的字符串表示形式,可以通过Boolean.Parse方法进行解析;也就是说,它必须是&#34; True&#34;,&#34; true&#34;,&#34; False&#34;或&#34; false&#34;。如果运行时遇到任何其他值,则忽略该开关。

在我的情况下,我做了这个

值名称:Switch.System.IdentityModel.DisableMultipleDNSEntriesInSANCertificate

价值数据: 真

enter image description here

缺点是它适用于机器上的所有应用程序。 在我的书中,注册表设置甚至比代码中的硬编码更不可取,因此我将坚持使用程序化方法。

这个技巧仍然很整洁,但只是为了快速尝试一下。

答案 1 :(得分:0)

您应该在解决方案资源管理器中修改App.config。此文件将重命名为YourAppName.exe.config,并且应位于您的二进制文件夹中。删除或重命名该文件将导致此开关覆盖无效。 (您也可以在构建后手动添加该文件)

我相信您必须手动将App.config放在您的exe旁边,这将有不正确的名称。

答案 2 :(得分:0)

我在.Net framework 4.6.2 <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=true"/>中观察到以下设置的类似行为 奇怪的是,它在正常运行时改变了行为,但在我们尝试运行UTC时失败了。