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

我偶然发现了非常奇怪的错误。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.


三国纷争
浏览 221回答 1
1回答

喵喵时光机

进程退出代码意义不大,您更喜欢看到调试器停止告诉您未处理的异常。但可以肯定的是,这不健康。这是一个反恶意软件引发的问题,他们不喜欢XML 文件。通常是程序员机器上的一个问题,他们也不喜欢看似无处出现的可执行文件,这些可执行文件是由使用进程互操作的进程创建的,就像 IDE 运行 msbuild 一样。强烈的恶意软件信号。因此,您要做的第一件事就是暂时关闭它,看看是否能解决问题。它肯定会,接下来你要做的就是切换到不那么激进的东西。操作系统提供的反恶意软件解决方案永远不会那样做。如果您使用 Avast 或其他任何具有“深度扫描”模式的设备,请尽快卸载。并且有点担心您的用户可能会使用什么,从 FileStream 获取 IOException 是很正常的,因此非常需要 try/catch。通常,您不想覆盖文件或删除您在几毫秒前创建的目录,幸运的是,这样做从来都不是明智之举。
打开App,查看更多内容
随时随地看视频慕课网APP