1

Java から呼び出して終了値をチェックする必要がある単純なルーチンを .Net で作成しました。何らかの理由で Java から呼び出すと、waitFor が終了しません。これは、コマンド プロンプトから呼び出されると .Net ルーチンがすぐに終了し、test.bat から呼び出されると正しく -1 を返すという事実にもかかわらずです。問題が何であるか誰にも分かりますか?

Java コードは次のとおりです。

public static int runOnceWait(String[] cmdarray) throws IOException, InterruptedException
{
    Process p;
    p = Runtime.getRuntime().exec(cmdarray);
    int res = p.waitFor();
    p.destroy();
    return res;
}

/**
 * @param args
 * @throws InterruptedException 
 * @throws IOException 
 */
public static void main(String[] args) throws IOException, InterruptedException
{
    String [] cmd = new String[2];
    cmd[0]=signer;
    cmd[1]=fileLocation;
    System.out.println ("\"" + cmd[0] + "\" \"" + cmd[1] + "\"");
    System.out.println (runOnceWait(cmd));
}

C# コードは次のとおりです。

    static int Main(string[] args)
    {
        if (args.Length != 1 && args.Length != 2)
        {
            Console.WriteLine("Use: ");
            Console.WriteLine("DocumentSigner.exe source");
            Console.WriteLine(" or");
            Console.WriteLine("DocumentSigner.exe source, destination");
            return -100;
        }

        string destination = null;

        try
        {
            if (args.Length == 1) destination = Sign(args[0]);
            else destination = Sign(args[0], args[1]);
            Console.WriteLine("Document signed and saved as " + destination);
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            return -1;
        }

        return 0;
    }

テスト目的で、期待どおりに動作する .bat ファイルを作成しました。つまり、-1 の ERRORLEVEL を返します。

.bat ファイルは次のとおりです。

@echo off
rem test.bat
"DocumentSigner.exe" "{5E3C1967-A26E-4FC5-A6A8-3F358F388A3D}.pdf"
@if "%ERRORLEVEL%" == "0" goto good

:fail
    echo Execution Failed
    echo return value = %ERRORLEVEL%
    goto end

:good
    echo Execution succeeded
    echo Return value = %ERRORLEVEL%
    goto end

:end
4

1 に答える 1

5

java.lang.Processの API リファレンスから(強調鉱山):

デフォルトでは、作成されたサブプロセスには独自の端末またはコンソールがありません。すべての標準 I/O (stdin、stdout、stderr) 操作は親プロセスにリダイレクトされ、メソッド getOutputStream()、getInputStream()、および getErrorStream() を使用して取得したストリームを介してアクセスできます。親プロセスは、これらのストリームを使用して、サブプロセスに入力をフィードし、サブプロセスから出力を取得します。一部のネイティブ プラットフォームでは、標準の入力ストリームと出力ストリームに対して限られたバッファー サイズしか提供されないため、サブプロセスの入力ストリームの書き込みまたは出力ストリームの読み取りが迅速に行われないと、サブプロセスがブロックされたり、デッドロックが発生したりする可能性があります。

私はあなたのC#アプリケーションが書いているものをJavaから読み込もうとしますConsole.WriteLine()。例えば、あなたの後にこのようなことをしますexec()

BufferedReader in = new BufferedReader(  
                    new InputStreamReader(p.getInputStream()));  
String line = null;  
while ((line = in.readLine()) != null) {  
    System.out.println(line);  
}  
于 2013-08-27T14:50:36.617 に答える