我想到的解决方案是从 Matlab GUI 创建一个独立的应用程序,并通过 C# 中的按钮启动它:
Process exeProcess = Process.Start("Data_Capture_Direct_call.exe");
if(!exeProcess.HasExited)
{
exeProcess.WaitForExit();
}
exeProcess.Close();
问题在于,Matlab GUI 的启动屏幕关闭后、实际程序打开之前,C# 检测到程序已关闭并继续执行下一行。
另外,接下来的几行代码没有正确执行:
List<String> Movement = new List<String>();
List<String> Repetition = new List<String>();
List<String> Duration = new List<String>();
using (CsvFileReader reader = new CsvFileReader("capture.csv"))
{
CsvRow row = new CsvRow();
while (reader.ReadRow(row))
{
Movement.Add(row[0]);
Repetition.Add(row[1]);
Duration.Add(row[2]);
}
}
for (int i = 1; i < Movement.Count; i++)
{
dataGridView1.Rows.Add(i, Movement[i], Repetition[i], Duration[i]);
}
发生的情况是,C# 错误地检测到进程关闭后,capture.csv 文件变空,并且数据未加载到数据网格中。
请让我知道我在哪里犯了错误,或者是否有更好的方法来做到这一点!
添加必要的dll: 首先我们将使用 COM 接口添加 dll 引用。单击项目上的人民币并选择[添加引用]选项。在新窗口中单击“COM”选项卡。在搜索文本框中输入“Matlab”。然后选择“Matlab Application (Version 7.10) Type Library”。
您应该获得如下参考:
现在您可以轻松地用 C# 完成在 Matlab 上能做的任何事情。让我们举一个基本的例子:
var acCtx = Type.GetTypeFromProgID("matlab.application.single");
var matlab = (MLApp.MLApp)Activator.CreateInstance(acCtx);
这两行是在代码中创建matlab实例。现在让我们在Matlab上进行简单的计算。
Console.WriteLine(matlab.Execute("1+2")); // This will output 3 on console.
matlab.Quit(); // you should close matlab in order to clean memory
让我们解决您的实际问题。您想要执行一个 Matlab GUI 程序。我认为您的 Gui 正在将一些数据记录到 CSV 文件中。然后您的 C# 程序处理该数据。您应该注意,您可以在 Matlab 中调用 GUI只需将程序名称写为命令即可。假设您有一个名为 myGui.m 的 GUI。您可以通过在命令行中调用 myGui 来调用该 gui,因为您可以编写 1+2 得到 3。
我们打电话给gui吧。
matlab.Execute("myGui"); // This will execute your Gui. You can use buttons to save data to CSV file
matlab.Quit();
我在此页面上扩展了示例: