首页 > 解决方案 > 在 C# MVC 中执行的 OCTAVE .m 文件

问题描述

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

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

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

我尝试了已经发布的东西,主要关注的是我的应用程序托管在天蓝色云中。所以,我不能在云中安装 octave。您能否建议我使用动态 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 页面中。

标签: c#asp.net-mvcmodel-view-controlleroctave

解决方案


推荐阅读