gpt4 book ai didi

azure - 在 Azure 上运行 native 代码

转载 作者:行者123 更新时间:2023-12-04 02:10:47 25 4
gpt4 key购买 nike

我正在尝试在 Azure 上运行 C 可执行文件。我有很多workerRoles,他们不断检查作业队列。如果队列中有作业,辅助角色将根据作业类中存储的命令行参数将 C 可执行文件的实例作为进程运行。 C 可执行文件通常会创建一些日志文件。我不知道如何访问这些创建的文件。其背后的逻辑是什么?创建的文件存储在哪里?谁能给我解释一下吗?我是 Azure 和 C# 的新手。

另一个问题是 C 可执行文件的所有工作实例都需要读取数据文件。我如何分发所需的文件?

最佳答案

首先,要认识到在 Windows Azure 中,您的辅助角色只是在 Windows 2008 Server 环境(SP2 或 R2)内运行。当您部署应用程序时,您还可以部署 C 可执行文件(或者从 blob 存储中获取它,但这更高级一些)。要了解您的应用程序在磁盘上的位置,请调用 Environment.GetEnvironmentVariable("RoleRoot") - 返回路径。通常,您的应用程序位于角色根目录下名为 AppRoot 的文件夹中。您会在那里找到 C 可执行文件。

接下来,您需要应用程序将其文件写入您在命令行上指定的输出目录。您可以使用角色的属性在本地虚拟机中设置存储。查看“本地存储”选项卡,并配置一个命名的本地存储区域:

enter image description here

现在您可以在代码中获取该存储区域的路径,并将其作为命令行参数传递:

var outputStorage = RoleEnvironment.GetLocalResource("MyLocalStorage");
var outputFile = Path.Combine(outputStorage.RootPath, "myoutput.txt");
var cmdline = String.Format("--output {0}", outputFile);

以下是使用命令行参数启动 myapp.exe 进程的示例:

var appRoot = Path.Combine(Environment.GetEnvironmentVariable("RoleRoot")
+ @"\", @"approot");

var myProcess = new Process()
{
StartInfo = new ProcessStartInfo(Path.Combine(appRoot, @"myapp.exe"), cmdline)
{
CreateNoWindow = false,
UseShellExecute = false,
WorkingDirectory = appRoot
}
};
myProcess.WaitForExit();

通常您会将 CreateNoWindow 设置为 true,但如果您可以看到命令 shell 窗口,则调试会更容易。

最后一件事:应用程序创建完文件后,您需要:

  • 处理它并删除它(它不在持久的位置,因此最终会消失)
  • 将存储更改为使用云驱动器(持久存储)
  • 将文件复制到 blob(持久存储)

在生产中,您需要添加异常处理,并且可以重新路由要捕获的 stdout 和 stderr。但这个示例代码应该足以帮助您入门。

OOPS - 还有“一件事”:将“myapp.exe”添加到项目时,请务必转到其属性,并将“复制到输出目录”设置为“始终复制” - 否则您的 myapp .exe 文件不会最终出现在 Windows Azure 中,您会想知道为什么事情不起作用。

编辑:将结果推送到 blob - 一个简单的示例

首先设置一个存储帐户并将其添加到您的角色的设置中。假设您将其命名为“AzureStorage” - 现在在代码中对其进行设置,获取对 blob 容器的引用,获取对该容器内 blob 的引用,然后执行到 blob 的文件上传:

        CloudStorageAccount storageAccount = CloudStorageAccount.FromConfigurationSetting("AzureStorage");
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer outputfiles = blobClient.GetContainerReference("outputfiles");
outputfiles.CreateIfNotExist();

var blobname = "myoutput.txt";
var blob = outputfiles.GetBlobReference(blobname);
blob.UploadFile(outputFile);

关于azure - 在 Azure 上运行 native 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5915870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com