2015-09-14 37 views
10

我試圖從app.config(或web.config)文件中的條目設置兼容性開關「Switch.System.Xml.IgnoreEmptyKeySequences」,但會出現重寫被忽略。 爲了消除任何奇怪配置的可能性,我已經在VS2015中創建了一個全新的.Net 4.6 Web Forms項目(和相關的測試項目)。.Net 4.6 AppContextSwitchOverrides沒有設置在配置中聲明的開關

我下面的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); 

但是我一直得到falsevalueWasFoundvalueFromContext

我已經嘗試過與其他開關值相同的結果。

我發現,如果我設置使用

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

然後如預期開關在代碼中設置開關(即我得到true兩個valueWasFoundvalueFromContext)。

但是我非常喜歡這個設定在App.config/web.config中

任何想法如何,我得到這個工作,將不勝感激。

+0

我在這裏看到相同的行爲,但是使用了_Switch.System.IdentityModel.DisableMultipleDNSEntriesInSANCertificate_開關。在Web.config(IIS應用程序)中設置它會被忽略,'TryGetSwitch'會得到和你一樣的結果,在代碼中設置它似乎是可行的。 – arfbtwn

回答

0

您應該在您的解決方案資源管理器中修改App.config。該文件將被重命名爲YourAppName.exe.config,並且應位於二進制文件夾中。刪除或重命名該文件將導致此切換覆蓋不起作用。 (你也可以在構建完成後手動添加該文件)

我相信你一定會將App.config放在你的exe旁邊手動執行,這將會產生不正確的名字。

0

我觀察到類似的行爲,在.Net框架4.6.2中的設置如下:<AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=true"/> 奇怪的是,它改變了正常運行時的行爲,但在我們嘗試運行UTC時失敗。

0

另一種方法是將該開關添加到註冊表中。它似乎工作。

MSDN文檔:

通過添加一個字符串值,其名稱是切換到在註冊表中的HKLM \ SOFTWARE \ Microsoft.NETFramework \ AppContext鍵的名稱。它的值必須是可由Boolean.Parse方法解析的布爾值的字符串表示形式;也就是說,它必須是「真」,「真」,「假」或「假」。如果運行時遇到任何其他值,它將忽略該開關。

在我來說,我這樣做

值名稱:Switch.System.IdentityModel。DisableMultipleDNSEntriesInSANCertificate

值數據: 真實

enter image description here

的缺點是,它適用於計算機上的所有應用程序。 在我的書中,註冊表設置比代碼中硬編碼的東西更不優選,所以我會堅持使用編程方法。

這個技巧仍然很整潔,只是爲了快速嘗試一下。

相關問題