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

时间:2019-01-14 20:38:23

标签: c# .net

我偶然发现了一个非常奇怪的错误。在第一个FileStream中使用using时-应用程序遍历循环并打印出“ Done”,但是,然后exits with the error code 5Try/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 个答案:

答案 0 :(得分:4)

进程退出代码并不意味着那么多,您更喜欢看到调试器停止告诉您未处理的异常。但是可以肯定,这是不健康的。它们don't like XML文件,这是一个反恶意软件引起的问题。通常,它们是程序员机器上的一个问题,它们也不喜欢看起来似乎无处出现的可执行文件,这些文件是由使用进程互操作的进程(如IDE确实运行msbuild)创建的。强大的恶意软件信号。因此,您要做的第一件事就是暂时将其关闭,看看是否可以解决问题。

可以肯定的是,您接下来要做的是切换到较不积极的地方。操作系统提供的反恶意软件解决方案永远不会遇到这种情况。如果您使用Avast或其他具有“深度扫描”模式的产品,则请尽快卸载。

并担心您的用户可能使用什么,从FileStream获取IOException非常正常,因此非常需要try / catch。通常,您不想覆盖毫秒前创建的文件或删除目录,幸运的是,这绝不是明智的选择。