6

C#コンソールアプリケーションを起動するAIRアプリを作成していますが、通信する必要があります。これには標準入力/標準出力を使用したいのですが、動作しないようです。

C#アプリが標準入力から入力を取得すると、標準出力を介して送り返すことになっています。「exit」を受信すると、終了します。これはコマンドラインからテストでき、正しく機能します。AIRから文字列を送信すると、C#アプリから応答がありません。

C#アプリを起動すると引数を送信しますが、そこから応答が返されるので、AIRアプリは少なくとも標準出力からメッセージを受信できますが、機能していないのは標準入力だけです。standardInputを介してAIRからメッセージを送信すると、キーコードを送信すると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); 
}
4

2 に答える 2

5

数か月前にこの問題に遭遇しましたが、代わりにコマンドライン引数を使用したため、解決することはありませんでした。何が起こっているのかを知りたいと思っているので、私はそれに戻ってきました。

.NET 3.5 以前をターゲットにすると、期待どおりに動作することがわかりました。v4.0 に戻すと、stdin に何も表示されません。問題がどこにあるのか正確にはわかりませんが、v3.5 でうまくいけば、それが解決策になるかもしれません。

于 2013-01-27T19:28:14.450 に答える