3

Azure ワーカーで実行しようとしているレガシー アプリケーションがあります。アプリケーションは、かなり一般的なパターンを使用して、匿名パイプを作成し、stdout をパイプにリダイレクトし、子プロセスを生成し、パイプを使用して通信することにより、子プロセスを起動します。

これを Azure で実行するには、このプロセス全体を開始する dll に対して P/Invoke 呼び出しを行います。

これらはすべて、Azure の外部では正常に機能しますが、エミュレーターで実行している場合でも失敗します。

Azure で実行している場合、proc はパイプ経由で通信できません。具体的には、親によるパイプへのハンドルでの read の呼び出しが失敗しています (タイムアウト)。

4

2 に答える 2

2

問題の原因は、従来のコードが標準出力ハンドルを複製して子プロセスに渡すためであることが最終的にわかりました。

Azure で実行すると、STDOUT の GetStdHandle が 0x0 を返していました。これは基本的に、「エラーはありませんが、STDOUT がありません」という意味です。どうやら、0x0 と INVALID_HANDLE を確認する必要があります。

ハンドルを作成し、既存のものを複製するのではなく、子を開始する前に STARTUPINFO に設定すると、すべてが修正されました。

于 2012-05-21T23:00:34.420 に答える
-1

以下の2つの提案があります。

  1. worker ロールを .net 4 でコンパイルしているかどうかお尋ねしてもよろしいですか? .net 4 を使用すると、特に P/Invoking のときにアプリケーションをネットワーク パイプにバインドする際に問題が発生するため、アプリケーション プロパティを .net 3.5 プロファイルに設定します。
  2. このレガシー プロセスをスタートアップ タスクから SYSTEM コンテキストで起動し、このアプリケーション EXE を CSDEF の ProgramEntryPoint にセットアップして、直接起動できるようにします。また、このアプリケーションで IP/ポートを使用していますか? はい、適切にバインドするには、ロール onStart() にコードを記述する必要があります。

あなたの結果を教えてください。

于 2012-05-19T17:13:42.813 に答える