为了账号安全,请及时绑定邮箱和手机立即绑定

创建 StreamWriter 实例会使应用程序崩溃并出现 RPC 错误

创建 StreamWriter 实例会使应用程序崩溃并出现 RPC 错误

C#
三国纷争 2022-07-23 09:14:30
我偶然发现了非常奇怪的错误。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。通常,您不想覆盖文件或删除您在几毫秒前创建的目录,幸运的是,这样做从来都不是明智之举。


查看完整回答
反对 回复 2022-07-23
  • 1 回答
  • 0 关注
  • 220 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号