文本未到达控制台
本文关键字:控制台 文本 | 更新日期: 2023-09-27 17:56:56
我有一个类型为"控制台"的 c# 项目,它从父应用程序中启动到它自己的应用程序域中,并生成一个控制台窗口。但是,写入控制台的任何文本都不会显示。 然而,Console.ReadKey()
确实有效。任何想法可能出了什么问题?
回显显示在父进程的嵌入式控制台(不是 win32 控制台,而是某种 directx GUI 小部件)中,Console.Out
和System.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 可以打印到它定义的控制台,而我的父应用程序仍然可以写入重定向流。虽然,这仍然只允许一个孩子;同上。
也许如果您能提供有关您如何生成应用程序域的代码,它会有所帮助?