3

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

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

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

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

4

2 回答 2

2

我终于发现问题是因为遗留代码复制了标准输出句柄以传递给子进程。

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

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

于 2012-05-21T23:00:34.420 回答
-1

我有以下两个建议:

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

让我知道你的结果是什么。

于 2012-05-19T17:13:42.813 回答