在Azure辅助角色中调用exe

时间:2011-06-09 10:47:37

标签: azure

我正在尝试在辅助角色中调用可执行文件

我尝试了不同的可执行文件:

1-program1.exe (C code compiled with visual studio, target: Win32)  
2-program2.exe (C# code, target: x86, this is a dummy program it only creates a text file)
3-program3.exe (C code compiled with visual studio, target: win32, this is a dummy program it only creates a text file)

我的目标是能够运行program1.exe。

结果:

1- no signs of success. It should generate some files for any successful run. No files were generated.
2- success. It creates the text file.
3- no signs of success. No file was generated.

所以,我想了解为什么program1.exe无法正常工作但无法找到原因。我明白问题不是program1.exe特有的。对于任何win32应用程序,都存在问题。

这可能是什么原因?

以下是处理调用外部应用程序的代码部分:

var localStorage = RoleEnvironment.GetLocalResource("WorkerLocalStorage");

String workingDir = localStorage.RootPath + @"job";

var appRoot = Path.Combine(Environment.GetEnvironmentVariable("RoleRoot")
            + @"\", @"approot");
String workingDir = localStorage.RootPath + @"job";
String cmdline = "command1 command2";

ProcessStartInfo startinfo = new ProcessStartInfo();
startinfo.CreateNoWindow = false;
startinfo.UseShellExecute = true;
startinfo.FileName = Path.Combine(appRoot, @"program1.exe");
//startinfo.FileName = Path.Combine(appRoot, @"program2.exe");
//startinfo.FileName = Path.Combine(appRoot, @"program3.exe");
startinfo.Arguments = cmdline;
startinfo.WorkingDirectory = workingDir;

Process exeProcess = Process.Start(startinfo);
exeProcess.WaitForExit();

program2.exe可以正常工作,我将文件上传到blob没有任何问题。我找不到问题。它可以与传递命令行参数相关吗?我是否需要为C编码的可执行文件指定其他内容?

顺便说一句,所有测试都在模拟器(即开发环境)中成功

1 个答案:

答案 0 :(得分:6)

我的直觉反应是你应该检查win32 exe的所有必要的dll是否可用 - 特别是像Visual C ++可再发行组件的dll - 如果缺少任何这些并且需要,那么应用程序将无法成功启动。使用dumplib或依赖于查看所需内容。

可能导致问题的另一件事是,如果您的exe没有对您传入的路径之一进行必要的读/写访问。

可能有助于您调试此问题的其他机制:

  • 检查Windows事件日志(使用azure诊断)以查看是否记录了任何事件
  • 在您的c#代码中,检查您的Process的退出代码 - 加上也尝试拦截StandardError
  • 在你的C代码中,添加额外的日志记录以查看测试可执行文件是否以某种方式在某处“崩溃”
  • 正如@Jason Haley在评论中建议的那样,尝试远程桌面进入你的虚拟机,看看发生了什么。

最后一点 - 为了最佳地使用Azure,您可能应该以64位C编译为目标,因为Azure VM都是64位。