文字无法进入控制台

时间:2013-02-01 16:21:39

标签: c# stdout

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

注意:父进程的回显显示在父进程的嵌入式控制台(不是win32控制台,而是某种类型的directx GUI小部件)Console.OutSystem.Console.Out不是“null”流。

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将跟踪输出推送到外部进程。

1 个答案:

答案 0 :(得分:2)

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

此外,基础Win32 API指出process can be associated with only one consolehttp://msdn.microsoft.com/en-us/library/ms681944%28VS.85).aspx

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

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