繁体   English   中英

在ac#控制台应用程序中禁止控制台写入(来自其他组件)

[英]suppressing Console Writes in a c# Console App (from other components)

我有一个简单的控制台应用程序,它以一种格式正确的方式写出了各种资源的状态。

这个应用程式正在使用一些第三者的组件来连接地方。

不幸的是,这些组件做了很多Console.Writes(或某种日志记录),最终都与我的消息交织在一起。

我尝试重定向控制台输出(希望可以过滤非地雷消息),但这似乎仅对我的消息有效。

var sb = new StringBuilder();
TextWriter tw = new StringWriter(sb);
Console.SetOut(tw);

因此,这在重定向控制台写入中有效,但仅在我所做的转换中..第三方组件的输出仍在流式传输到我的屏幕上。

您无法重定向第三方组件的输出的原因是因为您在进程而不是它们的进程上调用了重定向。 为此,请遍历进程,找到正在写入控制台的进程,然后重定向其输出。

 using System.Diagnostics;

 Process[] processlist = Process.GetProcesses();


 foreach(Process theprocess in processlist){
       // you'll actually need to use something like the process name or id here.
       if (theprocess == MyThirdPartyComponentsProcess)
       {
             theprocess.StartInfo.UseShellExecute = false;
             theprocess.StartInfo.RedirectStandardOutput = true; 
        }
  }

您必须以管理员身份运行才能完成此工作。

我想到了一种相当怪异的方式:

  • 捕获现有的Console.Out以便您可以在“实际” Console.Out器中重用它
  • 创建您自己的TextWriter实现,该实现...
  • ...当要求编写时,检查调用代码是否在程序集中。 请参见Assembly.GetCallingAssembly

只要您没有内联问题,您就应该能够检查上下文并删除不需要的任何输出。 请注意,您可能必须直接调用Console.Out.WriteLine而不是Console.WriteLine否则,调用者将是Console类。

更好的解决方案是将代码更改为使用log4net或类似的东西,这样您就可以以更可配置的方式获得输出,而不是在控制台上-假设您自己的使用也在记录日志。 (如果是用于交互式输出,则上面的内容可能是唯一的方法...)

由于似乎没有合理的快捷方法来抑制这些攻击,因此我采用了计划B,这将我的消息推迟到了最后。 这样,所有日志记录都可以通过,然后我便写出我感兴趣的所有信息。

我将其分解为成功/警告/错误方法

    public static void WriteError(string message, params string[] args) {
        writerTasks.Add(() => {
            var c = Console.ForegroundColor;
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(message, args);
            Console.ForegroundColor = c;
        });
    }

在执行结束时,我调用此方法将其冲洗掉。

    private static void WriteResults() {
        foreach (var t in writerTasks)
            t();
    }

我这样做是因为我要根据每个操作中包含的消息类型来更改文本颜色。

在我的情况下,这很好用,因为信息向上滚动以隐藏所有日志记录。.实际上,这也是有好处的..只是不想让它分散在主要输出之间

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM