我正在尝试从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).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
的{{1}}始终为valueFromContext
。
我已尝试使用其他开关值,结果相同。
我发现如果我使用
在代码中设置开关AppContext.SetSwitch("Switch.System.Xml.IgnoreEmptyKeySequences", true);
然后按预期设置开关(即我true
和valueWasFound
valueFromContext
。{/ p>
但我非常希望在App.Config / web.config
中设置它我将非常感谢任何有关如何使其发挥作用的想法。
答案 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
价值数据: 真
缺点是它适用于机器上的所有应用程序。 在我的书中,注册表设置甚至比代码中的硬编码更不可取,因此我将坚持使用程序化方法。
这个技巧仍然很整洁,但只是为了快速尝试一下。
答案 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时失败了。