我偶然发现了非常奇怪的错误。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 关注
- 220 浏览
添加回答
举报
0/150
提交
取消