在Azure上运行本机代码

del*_*unt 11 azure

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

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

Dav*_*gon 8

首先,要意识到在Windows Azure中,您的辅助角色只是在Windows 2008 Server环境(SP2或R2)中运行.部署应用程序时,您也将部署C可执行文件(或从blob存储中获取它,但这有点高级).要找出您的应用在磁盘上的位置,请调用Environment.GetEnvironmentVariable("RoleRoot")- 返回路径.您通常将应用程序放在角色根目录下名为AppRoot的文件夹中.你会在那里找到你的C可执行文件.

接下来,您希望应用程序将其文件写入您在命令行中指定的输出目录.您可以使用角色的属性在本地VM中设置存储.查看"本地存储"选项卡,并配置命名的本地存储区域:

在此输入图像描述

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

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

以下是使用命令行参数启动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();
Run Code Online (Sandbox Code Playgroud)

通常,您将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);
Run Code Online (Sandbox Code Playgroud)