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

时间:2014-06-02 14:37:54

标签: 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);
        }
    }
}

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

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

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

1 个答案:

答案 0 :(得分:3)

我认为这是由于Visual Studio托管您的应用程序的方式,以减少调试时的启动时间。

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

对此的一个修复是为应用程序提供要写入的文件的命令行参数 - 并在Main方法中打开该文件。在您再次开始运行应用程序之前,您不会那里

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

有关托管流程的详情,请参阅this blog post