在Azure上运行本机代码

时间:2011-05-06 19:00:51

标签: azure

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

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

2 个答案:

答案 0 :(得分:8)

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

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

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);

答案 1 :(得分:2)

在Azure中,您不应该写入文件系统。您应该写入SQL Azure,表存储或者很可能在这种情况下写入Blob存储(基本上,我认为您应该将blob存储视为旧文件系统)

这是因为:

  1. 您可以运行多个实例,最终您将在不同的实例(只是虚拟机)上拥有不同的文件

  2. 您的实例可能随时被移动,您将丢失文件系统上的信息,因为它不属于您的部署包。

  3. 使用三个存储选项之一将为您要访问的所有实例提供一个中央存储库,并将通过重新部署保留。