在我的项目中,我正在将Matlab GUI应用程序与C#应用程序集成。
我想到的解决方案是从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文件变为空,数据未加载到数据网格中。
请让我知道我在哪里犯了错误,或者有更好的方法来做到这一点!
答案 0 :(得分:1)
在我的解决方案中,您应该在启动代码之前进行一些设置,以便在C#应用程序中使用Matlab实例。
添加必要的dll: 首先,我们将使用COM接口添加dll引用。单击项目上的RMB,然后选择[添加引用]选项。在新窗口中单击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#程序处理这些数据。你应该注意你可以调用你的GUI在Matlab中只是将你的程序名称写成command.Suppose你有一个名为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();
我在此页面上扩展了示例: Source