6

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

注意:父进程的 Echo 显示在父进程的嵌入式控制台(不是 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 将跟踪输出推送到外部进程。

4

1 回答 1

2

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

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

如果你真的需要一个子控制台,你可能不得不分拆一个新进程并使用进程间通信。

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

于 2013-02-12T17:41:50.247 回答