文本未到达控制台

本文关键字:控制台 文本 | 更新日期: 2023-09-27 17:56:56

我有一个类型为"控制台"的 c# 项目,它从父应用程序中启动到它自己的应用程序域中,并生成一个控制台窗口。但是,写入控制台的任何文本都不会显示。 然而,Console.ReadKey()确实有效。任何想法可能出了什么问题?

注意:父进程的

回显显示在父进程的嵌入式控制台(不是 win32 控制台,而是某种 directx GUI 小部件)中,Console.OutSystem.Console.Out不是"空"流。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using ParentApi;
namespace LSTest4
{   
    class Program
    {
        static void Main(string[] args)
        {
            Console.OpenStandardOutput();
            ParentApi.Echo(System.Console.Out.ToString());
            Console.Out.WriteLine("monkeys");
            Console.WriteLine("app start");
            Console.Write("lalala");
            Console.ReadKey();
            ParentApi.Echo("app start");
    }
}

编辑:

经进一步调查:

有问题的代码被注入到另一个应用程序中,注入是恶意的,由"ParentApi"管理,似乎注入目标正在重新映射标准流。在这种情况下,最好的办法是以其他方式处理跟踪。我可以使用 WCF 将跟踪输出推送到外部进程。

文本未到达控制台

我认为您的问题将与父应用程序有关; 您提到父级不显示真正的 Win32 控制台,这就是我想象的孩子Console.WriteLine调用的地方。
我做了一点POC(很高兴分享代码),这表明父级可以使用Console.SetOut重定向控制台输出,但是对Console.WriteLine的不同AppDomain调用仍然转到主控制台而不是新流。

此外,底层 Win32 API 声明process can be associated with only one console:http://msdn.microsoft.com/en-us/library/ms681944%28VS.85).aspx

如果您确实需要子控制台,则可能必须剥离一个新进程并使用进程间通信。

编辑
稍微反驳一下,将我的父应用程序从控制台更改为 Windows(以便它仍然可以运行)意味着我的子 AppDomain 可以打印到它定义的控制台,而我的父应用程序仍然可以写入重定向流。虽然,这仍然只允许一个孩子;同上。
也许如果您能提供有关您如何生成应用程序域的代码,它会有所帮助?