C # — выполнение программы в рабочей роли Azure работает в локальном эмуляторе, но не в облаке

У меня есть исполняемый файл, который я запускаю в рабочей роли со следующим кодом в моей рабочей роли:

 try
{
//Get local storage path
var locRes = RoleEnvironment.GetLocalResource("data");
var localStoragePath = String.Format(locRes.RootPath);

var p = new Process();
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
p.StartInfo.FileName = this._processorExecutable;
p.StartInfo.EnvironmentVariables["TEMP"] = localStoragePath;
p.StartInfo.EnvironmentVariables.Add("transparency", "1");
p.StartInfo.EnvironmentVariables.Add("verbose", "1");
p.StartInfo.EnvironmentVariables.Add("in", _inFile);
p.StartInfo.EnvironmentVariables.Add("format", filetype);
p.StartInfo.EnvironmentVariables.Add("out", localStoragePath + msg.flameOutFile);
msg.flameOutFile = localStoragePath + msg.flameOutFile;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.Start();
_cloudUtil.StoreNewLogMessage(new LogMessage(p.StandardOutput.ReadToEnd()));
_cloudUtil.StoreNewLogMessage(new LogMessage(p.StandardError.ReadToEnd()));
p.WaitForExit();
var fi = new FileInfo(msg.flameOutFile);
}
catch (Exception ex)
{
_cloudUtil.StoreNewLogMessage(new LogMessage("Error: " + ex));
}

Упомянутый exe-файл — это программа командной строки для рендеринга пламенных фракталов, которую можно найти здесь:
https://code.google.com/p/flam3/downloads/list

Работает как положено локально в эмуляторе. Я могу предоставить файл XML для программы, которую он будет использовать для визуализации фрактала пламени и вывода файла изображения. Счастливые дни.

Моя проблема в том, что когда я запускаю его в облачной производственной среде, я получаю сообщение об ошибке от программы, которое не могу интерпретировать.

Я получаю ошибку:

FLAM3: чтение строки из временного файла: неверный аргумент

Что вытекает из следующего кода в фрактальной программе:

    char *flam3_print_to_string(flam3_genome *cp) {

FILE *tmpflame;
long stringbytes;
char *genome_string;

int using_tmpdir = 0;
char *tmp_path;
char tmpnam[256];

tmpflame = tmpfile();
if (NULL==tmpflame) {
#ifdef _WIN32
// This might be a permissions problem, so let's try to open a
// tempfile in the env var TEMP's area instead
tmp_path = getenv("TEMP");

if (tmp_path != NULL) {
strcpy(tmpnam, tmp_path);
strcat(tmpnam, "\\fr0st.tmp");
tmpflame = fopen(tmpnam, "w+");
if (tmpflame != NULL) {
using_tmpdir = 1;
}
}
#endif
if (using_tmpdir == 0) {
perror("FLAM3: opening temporary file");
return (NULL);
}
}
flam3_print(tmpflame,cp,NULL,flam3_dont_print_edits);
stringbytes = ftell(tmpflame);
fseek(tmpflame,0L, SEEK_SET);
genome_string = (char *)calloc(stringbytes+1,1);
if (stringbytes != fread(genome_string, 1, stringbytes, tmpflame)) {
perror("FLAM3: reading string from temp file");
}
fclose(tmpflame);

if (using_tmpdir)
unlink(tmpnam);

return(genome_string);
}

Полный источник можно найти здесь:
https://code.google.com/p/flam3/source/browse/trunk/src/flam3.c

Я надеюсь, что кто-то может пролить свет на то, почему программе не удается отобразить изображения в производственной среде.
Мои мысли куда-то шли в направлении чего-то с разрешениями или схожими проблемами безопасности.

Любая помощь будет оценена.


ОБНОВИТЬ:


Я пытался выяснить, что tmp_path возможно. Но я немного борюсь с этим. Я не могу скомпилировать программу, с которой у меня проблемы, хотя у меня есть исходный код.
В качестве альтернативы я создал небольшую программу на c ++, которая эмулирует раздел с проблемой. Положите это не выводит ничего на стандартный вывод:

#include "stdafx.h"#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
#pragma warning(push)
#pragma warning(disable: 4996) //4996 for _CRT_SECURE_NO_WARNINGS equivalent

cout << "Entering debugger\n";

FILE *tmpflame;
long stringbytes;
char *genome_string;

int using_tmpdir = 0;
char *tmp_path;
char tmpnam[256];

// deprecated code here
tmpflame = tmpfile();

//strcpy (tmpflame->_tmpfname,tmpnam);
if (NULL==tmpflame) {
#ifdef _WIN32
cout <<"Entering branch 1\n";

// This might be a permissions problem, so let's try to open a
// tempfile in the env var TEMP's area instead
tmp_path = getenv("TEMP");

if (tmp_path != NULL) {
cout <<"Entering branch 2\n";

strcpy(tmpnam, tmp_path);
strcat(tmpnam, "\\fr0st.tmp");
tmpflame = fopen(tmpnam, "w+");
if (tmpflame != NULL) {
cout <<"Entering branch 3\n";
using_tmpdir = 1;
}
}
#endif
}
cout <<tmpflame->_tmpfname;
return 0;
#pragma warning(pop)

}

1

Решение

Правильно.
Проблема оказалась в разрешении. Каким-то образом исполняемый файл не получает правильные учетные данные.
Я решил это, подняв рабочую роль:
Добавление <Runtime executionContext="elevated" /> к .csdef внутри <WorkerRole>

2

Другие решения

Других решений пока нет …