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

C# Visual Studio在调试结束时清除输出文件,c#,visual-studio,visual-studio-2013,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

我在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);
        }
    }
}
在项目属性的“调试”选项卡中,我已将输出重定向到一个文件,如下所示:

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


VisualStudio为什么要这样做?有没有办法绕过这种行为?

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

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

一种修复方法是为应用程序提供一个命令行参数,让文件写入,并在
Main
方法中打开该文件。除非你再次开始运行应用程序,否则你无法达到目标

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


有关托管进程的更多信息,请参阅。

从命令行运行托管进程时会发生什么?(我暗自怀疑这可能是由于VS托管应用程序的方式……我认为它可能会在前一个进程退出后立即启动一个新进程,但等待您在启动您的部分之前真正点击“运行”…)请尝试>>output.txt。它似乎在覆盖自己。使用两个大于的符号将追加文件。如果不存在,将创建文件。@JonSkeet Hm,可能是这样,因为如果我使用与VS中相同的输出文件,实际上
CsSandbox>output.txt
会失败。它说该文件由不同的进程使用,只有在关闭VS时才开始工作。@JasonHughes谢谢,文件的内容会保留:)当然,文件是附加的,虽然我更喜欢覆盖,但我也可以接受:)您可以使用streamwriter而不是命令行参数,如果您只希望它在调试模式下运行,可以将其包装在调试约束中。谢谢:)我现在正在添加参数。稍后我会看看这篇博文。很高兴知道这样的事情:)