注意:該代碼適用于 Windows 11 (22000.1098) 及更早版本,但在 Windows 11 (22621.525) 上會導致堆疊溢位例外
我有一個錯誤導致我負責的 C# 程式出現大量問題。它在早期的 Windows 版本(包括早期的 Windows 11)中運行良好。它也適用于除錯版本。但它在發布版本中引發例外。我已經深入研究了出現問題的各個功能,這很奇怪。
代碼類似于
MySettings.MySetting setting = new MySettings.MySetting()
{
Value = Double.NaN,
Values = new double[] { Double.NaN },
Special = "" }
});
但如果我將 Double.NaN 更改為數值,則代碼有效。
我試圖將其簡化為
MySettings.MySetting setting = new MySettings.MySetting();
set1.Value = Double.NaN;
set1.Values = new double[] { Double.NaN };
set1.Special = "";
洗掉 Special 不會改變任何內容,但如果 Value 或 Values 是 NaN 則會引發例外。
最小形式的設定類是
public class MySetting
{
public Double Value { get; set; }
public string Special { get; set; }
public Double[] Values { get; set; }
public ValueSpecial[] Specials { get; set; }
public ValueSpecial AddSpecial(string code, string value)
{
ValueSpecial special = new ValueSpecial() { Code = code, Value = value };
return special;
}
public void ForgetSpecial(string code)
{
}
public override string ToString()
{
return "Not today";
}
}
ValueSpecial 非常簡單
public class ValueSpecial
{
public string Code { get; set; }
public string Value { get; set; }
public override string ToString()
{
return "dummy";
}
}
呼叫堆疊看起來很無辜。Main() -> MainForm() -> InitializeComponent() -> MyControl() 所以它似乎沒有進行任何遞回。
Microsoft 在此版本的 Windows 中進行了哪些更改,我該如何解決?
請注意,相同的二進制檔案適用于 Windows 11 22000.1098,因此不要只關注代碼。
看起來https://stackoverflow.com/a/25208200/1771388可能會給出答案。
uj5u.com熱心網友回復:
不是這樣的修復,而是一種解決方法。該問題發生在 FPU 中,可能是由較舊的程式或庫引起的。它出現在 Windows 11 (22621.525) 中但未出現在早期版本中可能與 Windows 作業方式的變化有關。
無論如何,您可以通過添加強制重置 PFU 來解決問題
try
{
throw new Exception("Please ignore, resetting FPU");
}
catch {}
在呼叫導致例外的函式之前。如果您需要從多個地方執行此操作,則將其包裝到一個函式中可能是個好主意。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/518631.html
標籤:C#。网视窗
