我偶然發現了非常奇怪的錯誤。FileStream在第一個應用程序中使用時,using會遍歷循環并打印出“Done”,但是,它是exits with the error code 5. Try/Catch也不行。這似乎是非常脆弱的錯誤狀態,因為如果我擺弄文件名(例如C:\TFS\file1.xml.No.xml-> C:\TFS\file1.xml.N.xml),那么它工作正常。如果我var tw = File.CreateText在第一次使用中使用,那么應用程序exits with the code 1073741845。對于可重現的示例,我已設法將問題顯著減少到以下幾行代碼。也許有人可以解釋為什么這會表現得如此奇怪?我也對為什么我無法從這個錯誤狀態中恢復感興趣?我試過了[HandleProcessCorruptedStateExceptions],[SecurityCritical]沒有效果。 static void Main(string[] args) { var ds = new DataSet(); for (int i = 0; i <= 2; i++) { using (var fs = new FileStream(@"C:\TFS\file1.xml.No.xml", FileMode.Create)) { } using (var tw = File.CreateText(@"C:\TFS\file1.xml")) { ds.WriteXml(tw); } Console.WriteLine($"Pass {i} done."); } Console.WriteLine("Done"); Console.ReadLine(); } 使用 .NET Framework 4.7 控制臺應用程序項目。編輯:如果我Thread.Sleep(2000)輸入每條using語句-然后在第二遍之后遇到此錯誤-它會在打印之前打印Pass 1 done.,因此寫入頻率似乎與此行為無關。Pass 2 done.has exited with code 5 (0x5)在進一步修改這個小樣本后 - 我可以DataSet在完全不使用并且只創建StreamWriter實例的情況下重現該問題。下面的例子應該在突然退出之前產生:TW1 created.TW1 flushed.TW1 created.TW2 flushed.Pass 0 done. static void Main(string[] args) { for (int i = 0; i <= 2; i++) { var tw1 = File.CreateText(@"C:\TFS\file1.xml.No.xml"); Console.WriteLine("TW1 created."); tw1.Flush(); Console.WriteLine("TW1 flushed."); Thread.Sleep(2000); var tw2 = File.CreateText(@"C:\TFS\file1.xml"); Console.WriteLine("TW1 created."); tw2.Flush(); Console.WriteLine("TW2 flushed."); Thread.Sleep(2000); Console.WriteLine($"Pass {i} done."); } Console.WriteLine("Done"); Console.ReadLine(); }** EDIT2:** 所以在我們看來,這個問題是由Kaspersky Endpoint Security for Windows v11.
1 回答

喵喵時光機
TA貢獻1846條經驗 獲得超7個贊
進程退出代碼意義不大,您更喜歡看到調試器停止告訴您未處理的異常。但可以肯定的是,這不健康。這是一個反惡意軟件引發的問題,他們不喜歡XML 文件。通常是程序員機器上的一個問題,他們也不喜歡看似無處出現的可執行文件,這些可執行文件是由使用進程互操作的進程創建的,就像 IDE 運行 msbuild 一樣。強烈的惡意軟件信號。因此,您要做的第一件事就是暫時關閉它,看看是否能解決問題。
它肯定會,接下來你要做的就是切換到不那么激進的東西。操作系統提供的反惡意軟件解決方案永遠不會那樣做。如果您使用 Avast 或其他任何具有“深度掃描”模式的設備,請盡快卸載。
并且有點擔心您的用戶可能會使用什么,從 FileStream 獲取 IOException 是很正常的,因此非常需要 try/catch。通常,您不想覆蓋文件或刪除您在幾毫秒前創建的目錄,幸運的是,這樣做從來都不是明智之舉。
- 1 回答
- 0 關注
- 240 瀏覽
添加回答
舉報
0/150
提交
取消