管道读取在Azure上失败

时间:2012-05-18 20:48:12

标签: c# c++ .net azure pinvoke

我有一个遗留应用程序,我试图在Azure工作者下运行。该应用程序使用一种相当常见的模式来启动子进程,方法是创建一个匿名管道,将stdout重定向到管道,生成子进程,然后使用管道进行通信。

为了让它在Azure下运行,我对启动整个过程的dll进行P / Invoke调用。

所有这些在Azure之外工作正常,但即使在模拟器下运行也会失败。

在Azure下运行时,procs无法通过管道进行通信。具体来说,父进程读取管道句柄的调用失败(超时)。

2 个答案:

答案 0 :(得分:2)

我终于弄清楚问题是因为遗留代码重复了stdout句柄以传递给子进程。

在Azure下运行,STDOUT的GetStdHandle返回0x0。这基本上意味着“没有错误,但你没有STDOUT”。显然,您需要检查0x0 AND INVALID_HANDLE。

创建句柄,在启动子项之前在STARTUPINFO上设置它们而不是复制现有的句柄会修复所有内容。

答案 1 :(得分:-1)

我有两条建议如下:

  1. 请问您是否正在使用.net 4编译您的工作者角色?使用.net 4有一些问题,特别是在P / Invoking时将应用程序绑定到网络管道,因此将应用程序属性设置为.net 3.5配置文件。
  2. 使用SYSTEM上下文从启动任务启动此遗留流程,并将此应用程序EXE设置为CSDEF中的ProgramEntryPoint,以便可以直接启动它。您也在使用此应用程序的任何IP /端口?是的,您必须在您的角色onStart()中编写一些代码才能正确绑定。
  3. 让我知道你的结果是什么。