我正在写一个启动C#控制台应用程序的AIR应用程序,他们需要进行交流。我想为此使用标准输入/标准输出,但是我似乎无法使其正常工作。

当C#应用程序从标准输入中获取输入时,它应该通过标准输出将其发送回去,如果它收到“退出”,则退出。我可以从命令行进行测试,并且可以正常工作。从AIR发送字符串时,C#应用程序没有响应。

启动C#应用程序时,我正在发送一个参数,但确实得到了响应,因此我的AIR应用程序至少能够从标准输出接收消息,这只是标准输入无法正常工作。当我通过standardInput从AIR发送消息时,当我发送 key 代码时,我收到了一个进度事件,其中bytesLoaded = 3,而当我发送“exit”命令时,则获得了bytesLoaded = 5。

这是C#代码:

static void Main(string[] args)
{
    if (args.Length > 0)
    {
        Console.WriteLine(args[0]);
    }
    while (true)
    {
        string incoming = Console.ReadLine();
        string outgoing = "received: " + incoming;
        Console.WriteLine(outgoing);
        if (incoming == "exit")
            return;
    }
}

这是AS3代码:
private function init(e:Event=null):void {
    this.removeEventListener(Event.ADDED_TO_STAGE, init);
    NativeApplication.nativeApplication.addEventListener(Event.EXITING, onAppClose);

    var info:NativeProcessStartupInfo = new NativeProcessStartupInfo();
    var file:File = File.applicationDirectory.resolvePath("test.exe");
    info.executable = file;

    process = new NativeProcess();
    info.arguments.push("native process started");
    process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData);
    process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, onErrorData);
    process.addEventListener(ProgressEvent.STANDARD_INPUT_PROGRESS, onInputProgress);
    process.addEventListener(Event.STANDARD_OUTPUT_CLOSE, onOutputClose);
    process.addEventListener(Event.STANDARD_ERROR_CLOSE, onErrorClose);
    process.addEventListener(IOErrorEvent.STANDARD_ERROR_IO_ERROR, onIOError);
    process.addEventListener(IOErrorEvent.STANDARD_INPUT_IO_ERROR, onIOError);
    process.addEventListener(IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, onIOError);
    stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);

    process.start(info);
}

private function onKeyUp(e:KeyboardEvent):void {
    if (e.keyCode == Keyboard.ESCAPE)
        process.standardInput.writeUTFBytes("exit\n");
    else {
        var msg:String = e.keyCode + "\n";
        process.standardInput.writeUTFBytes(msg);
    }
}

private function onOutputData(e:ProgressEvent):void {
    var data:String = process.standardOutput.readUTFBytes(process.standardOutput.bytesAvailable);
    trace("Got: ", data);
}

最佳答案

几个月前,我遇到了这个问题,但是由于只使用了命令行参数,所以我从未解决过。尽管我很想知道发生了什么,但我还是回到了它。

现在,我发现以.NET 3.5或更早版本为目标可以使其按预期工作。切换回v4.0,我在stdin上一无所获。我不确定问题出在哪里,但是如果您可以使用v3.5,那么这可能是您的解决方案。

关于c# - AIR NativeProcess standardInput未连接到应用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14532442/

10-14 20:41
查看更多