Visual Studio在调试结束时清除输出文件

kam*_*ilk 5 c# visual-studio visual-studio-2013

我在Visual Studio 2013中遇到了一个奇怪的行为.我有一个C#程序写入标准输出,让我们说

using System;
using System.Threading;

namespace CsSandbox
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello world!");
            Thread.Sleep(10000);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在项目属性的Debug选项卡中,我已将输出重定向到文件,如下所示: 命令行选项

如果我在应用程序仍在运行时在这些10s内打开文件,则该文件确实包含"Hello world!".但是,一旦程序退出,文件就会被清除.从命令行运行程序时不会发生这种情况.

有没有理由为什么Visual Studio会这样做?有没有办法绕过这种行为?

Jon*_*eet 3

我相信这是由于 Visual Studio 托管应用程序的方式所致,以便减少调试时的启动时间。

发生的情况是,您的应用程序 (Program.exe) 实际上将托管在另一个进程 (Program.vshost.exe) 中,该进程使用相同的命令行参数启动。当您的应用程序结束时,此过程将立即重新启动。您应该能够在任务管理器中看到这一点 - 查看详细信息选项卡,以便您可以看到进程的 PID,然后运行您的应用程序 - 您将看到一个 Program.vshost.exe 实例,该实例在您的应用程序完成时结束,并且另一个立即出现。这将覆盖您的输出文件。

解决此问题的一种方法是为您的应用程序提供一个用于写入文件的命令行参数 - 并在您的Main方法中打开该文件。在您再次开始运行该应用程序之前,您将无法到达那里。

另一种选择是简单地停止使用托管进程 - 在项目属性的“调试”部分中,底部您应该会看到“启用 Visual Studio 托管进程”的复选框。取消选中此选项,我认为您的问题将会消失 - 但开始调试需要更长的时间。

有关托管过程的更多信息,请参阅此博客文章。