.Net 4.6 AppContextSwitchOverrides未设置在配置中声明的开关

15

我试图通过在app.config(或web.config)文件中的条目中设置兼容性开关“Switch.System.Xml.IgnoreEmptyKeySequences”,但似乎被忽略了。为了消除任何奇怪配置的可能性,我已经创建了一个全新的.NET 4.6 Web Forms项目(和相关的测试项目)在VS2015中。

我正在遵循 Microsoft 关于 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);

但是我始终会得到false,无论是对于valueWasFound还是valueFromContext

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

我发现如果我在代码中使用以下方式设置开关

AppContext.SetSwitch("Switch.System.Xml.IgnoreEmptyKeySequences", true);

然后开关被设置成预期的状态(即对于valueWasFoundvalueFromContext都得到true的结果)。

但我非常希望在App.Config / web.config中进行此设置。


我在這裡看到了相同的行為,但是使用 Switch.System.IdentityModel.DisableMultipleDNSEntriesInSANCertificate 開關。在 Web.config(IIS 應用程式)中設置被忽略,並且 TryGetSwitch 得到的結果與您一樣,但在代碼中設置似乎有效。 - arfbtwn
3个回答

1

另一种方法是将开关添加到注册表中。这似乎有效。

MSDN文档:

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

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

值名称:Switch.System.IdentityModel.DisableMultipleDNSEntriesInSANCertificate

值数据: true

enter image description here

这种方法的缺点是它适用于机器上的所有应用程序。在我看来,注册表设置甚至比硬编码在代码中还不受欢迎,所以我会坚持采用编程方法。但是,这个技巧仍然很好,可以快速尝试一些东西。

1
我在.NET Framework 4.6.2中使用以下设置观察到类似的行为:<AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=true"/>。奇怪的是,它会在正常运行时更改行为,但在尝试运行UTC时失败。

0
你应该在解决方案资源管理器中修改 App.config 文件。该文件将被重命名为 YourAppName.exe.config 并应位于二进制文件夹中。删除或重命名该文件将导致此开关覆盖无效。(您也可以在构建后手动添加该文件)。
我相信你一定是手动将 App.config 放在了 exe 旁边,这将导致文件名不正确。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接