OCTAVE .m文件在C#MVC中执行

时间:2018-12-19 12:45:41

标签: c# asp.net-mvc model-view-controller octave

我的应用程序是在带有框架4.5.2的C#MVC中,并且想要运行外部文件(.m)并从中获取输出,并且它是用Octave编写的。

注意:输出结果是一个字符串,因此我必须在C#html页面中显示该输出。

算法用八度编写,算法excel文件中也可以读取数据,外部参数也通过C#传递。

我尝试了已经发布的内容,主要问题是我的应用程序托管在Azure云中。因此,我无法在云中安装八度。 您能建议我使用动态excel文件和参数直接运行外部文件(.m)的其他方法吗? 我可以向我的代码展示我的工作。它可以在所有本地工作,但是我无法在Azure云中安装Octave。 我将已安装的文件夹放在服务器上的根路径上,但也无法正常工作。

public Octave(string pathToOctaveBinaries, bool createWindow)
    {
        StartOctave(pathToOctaveBinaries, createWindow);
    }

private void StartOctave(string pathToOctaveBinaries, bool createWindow)
    {
        _ptob = pathToOctaveBinaries;
        cw = createWindow;
        this.OctaveEchoString = Guid.NewGuid().ToString();
        OctaveProcess = new Process();
        ProcessStartInfo pi = new ProcessStartInfo();

        if (pathToOctaveBinaries[pathToOctaveBinaries.Length - 1] != '\\')
            pathToOctaveBinaries = pathToOctaveBinaries + "\\";
        pi.FileName = pathToOctaveBinaries + "octave-cli.exe";
        pi.RedirectStandardInput = true;
        pi.RedirectStandardOutput = true;
        pi.RedirectStandardError = true;
        pi.UseShellExecute = false;
        pi.CreateNoWindow = !createWindow;
        pi.Verb = "open";
        //
        pi.WorkingDirectory = ".";
        OctaveProcess.StartInfo = pi;
        OctaveProcess.Start();
        OctaveProcess.OutputDataReceived += new DataReceivedEventHandler(OctaveProcess_OutputDataReceived);
        OctaveProcess.BeginOutputReadLine();
        OctaveEntryText = ExecuteCommand(null);
    }

public string ExecuteCommand(string command, int timeout)
    {
        if (OctaveProcess.HasExited)
        {
            StartOctave(_ptob, cw);
            if (OctaveRestarted != null) OctaveRestarted(this, EventArgs.Empty);
        }
        _exitError = false;

        Thread tmp = new Thread(new ParameterizedThreadStart(WorkThread));
        tmp.Start(command);

        if (!tmp.Join(timeout))
        {
            tmp.Abort();
            throw new Exception("Octave timeout");
        }
        if (_exitError)
        {
            throw new Exception(_errorMessage);
        }
        return SharedBuilder.ToString();
    }

以上是Octave类文件。我动态传递.exe路径以作为线程运行的地方。

控制器代码:

Octave octave = new Octave(OctaveFilePath, false);
string fileData = result.Data.ToString();
fileData = fileData.Replace("#ExcelFilePath#", excelFilePath);
fileData = fileData.Replace("#ABCD#", historyData);
string rasp = octave.ExecuteCommand(fileData, 30000);

从这里我得到字符串,并显示在html页面中。

0 个答案:

没有答案