我如何 "shell out" 到 Azure webjob 中的二进制文件?
How do I "shell out" to a binary in an Azure webjob?
我需要创建一个脱机作业处理器,它将根据队列调用具有不同命令行标志集的控制台可执行文件。我在 Visual Studio 中使用 "Azure WebJobs SDK: Queues" 模板创建了一个新项目。我知道我可以将其部署到 Azure,它会创建一个虚拟机并将其全部设置为正常工作。
我已经有一个网络 "worker role" 基本上做同样的事情,但是,在那种情况下,我编写了它调用的代码,并获得了我的代码所需的库的源代码。这次,我需要调用别人编写的 "canned" 二进制文件,而我无法访问它的源代码。
我可以在项目中创建一个子文件夹,并将可执行文件(及其所有文件夹和库)转储到该文件夹中,但我不知道如何从我的网络作业中调用它。如果二进制文件仅位于项目的子文件夹中,一旦部署到 Azure 中的云服务,二进制文件的路径结构是什么?
此外,此二进制文件确实希望位于 C:\Software\ 中。当此应用程序部署到 Azure 中的云服务时,是否可以指定要在虚拟机上创建的这个特定的外部目录?如果我能做到这一点,它会工作得更好,而且我会准确地知道如何调用可执行文件。
您可以使用相对路径来定位您的子可执行文件。当前目录始终是您的主要 WebJob exe 所在的位置 运行ning,这使得在子文件夹中查找附属文件变得容易。
但是,您不能将您的 exe 放在 c:\software\directory
中。您将需要确保您需要生成的 exe 可以 运行 来自任意文件夹。
作为工作者角色的一部分,您可以创建一个子文件夹,并将您的二进制文件放入其中。 (执行此操作时不能将文件夹拖放到 Visual Studio 中,因此,就我而言,我必须创建几个子文件夹,然后将文件放入其中,以使我的应用程序正常工作。)
部署后,辅助角色会将这个包含任意文件的文件夹复制到 Azure 中的辅助服务器,然后可以在其中调用它。部署后,这个任意文件夹将位于 ...TASACDWS\TASACDWS\TASACDWS\csx\Debug\roles\TASACDWS_Worker\approot
worker角色本身的"root"或"base"文件夹就是进程的当前目录。因此,如果我的应用程序位于工作者角色下的名为 "Arbitrary_Binary" 的文件夹中(在 Visual Studio 中),我可以使用 Process 对象引用它,如下所示:
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.WorkingDirectory = "Arbitrary_Binary";
p.StartInfo.FileName = "Arbitrary_Binary\Arbitrary_Binary.exe";
p.Start();
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
我需要创建一个脱机作业处理器,它将根据队列调用具有不同命令行标志集的控制台可执行文件。我在 Visual Studio 中使用 "Azure WebJobs SDK: Queues" 模板创建了一个新项目。我知道我可以将其部署到 Azure,它会创建一个虚拟机并将其全部设置为正常工作。
我已经有一个网络 "worker role" 基本上做同样的事情,但是,在那种情况下,我编写了它调用的代码,并获得了我的代码所需的库的源代码。这次,我需要调用别人编写的 "canned" 二进制文件,而我无法访问它的源代码。
我可以在项目中创建一个子文件夹,并将可执行文件(及其所有文件夹和库)转储到该文件夹中,但我不知道如何从我的网络作业中调用它。如果二进制文件仅位于项目的子文件夹中,一旦部署到 Azure 中的云服务,二进制文件的路径结构是什么?
此外,此二进制文件确实希望位于 C:\Software\
您可以使用相对路径来定位您的子可执行文件。当前目录始终是您的主要 WebJob exe 所在的位置 运行ning,这使得在子文件夹中查找附属文件变得容易。
但是,您不能将您的 exe 放在 c:\software\directory
中。您将需要确保您需要生成的 exe 可以 运行 来自任意文件夹。
作为工作者角色的一部分,您可以创建一个子文件夹,并将您的二进制文件放入其中。 (执行此操作时不能将文件夹拖放到 Visual Studio 中,因此,就我而言,我必须创建几个子文件夹,然后将文件放入其中,以使我的应用程序正常工作。)
部署后,辅助角色会将这个包含任意文件的文件夹复制到 Azure 中的辅助服务器,然后可以在其中调用它。部署后,这个任意文件夹将位于 ...TASACDWS\TASACDWS\TASACDWS\csx\Debug\roles\TASACDWS_Worker\approot
worker角色本身的"root"或"base"文件夹就是进程的当前目录。因此,如果我的应用程序位于工作者角色下的名为 "Arbitrary_Binary" 的文件夹中(在 Visual Studio 中),我可以使用 Process 对象引用它,如下所示:
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.WorkingDirectory = "Arbitrary_Binary";
p.StartInfo.FileName = "Arbitrary_Binary\Arbitrary_Binary.exe";
p.Start();
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();