能否从C#调用多类MATLAB项目并交互取值?附测试问题
问题解答
1. 空字符串返回的错误原因
你通过matlab.Execute("value = obj.getValueX();")获取返回值时,MATLAB默认不会将赋值语句的结果输出到命令窗口,因此Execute方法自然返回空字符串。要正确获取数值,需使用GetWorkspaceData方法读取MATLAB工作区中的变量,而非依赖Execute的返回内容。
修改后的C#代码示例:
private void button_start_Click(object sender, EventArgs e) { try { matlab = new MLApp.MLApp(); matlab.Execute(@"cd C:\Path"); // 确保路径指向MATLAB类文件所在目录 matlab.Execute("obj = MyClass();"); // 调用方法并将结果存入工作区变量 matlab.Execute("currentValue = obj.getValueX();"); // 从MATLAB工作区读取变量值 object value; matlab.GetWorkspaceData("currentValue", "base", out value); Console.WriteLine("当前ValueX值:" + value.ToString()); } catch (Exception ex) { MessageBox.Show("Error : " + ex.Message); } }
你也可以直接执行方法而不赋值,让MATLAB把结果输出到命令窗口,此时Execute就能返回对应值,但这种方式在处理复杂数据时不如读取工作区变量可靠:
var result = matlab.Execute("obj.getValueX()"); Console.WriteLine(result);
2. 多类MATLAB项目与C#交互的可行性
完全可行,只需满足以下条件:
- 所有MATLAB类文件都放在MATLAB可访问的路径下(可通过
matlab.Execute("addpath('你的多类项目根目录')")添加路径,或直接cd到项目目录); - 类的继承、依赖关系在MATLAB中本身可正常运行;
- 调用逻辑与单个类一致:通过
Execute创建对象,调用对象方法,再用GetWorkspaceData获取结果,或直接执行方法获取输出。
例如项目包含相互依赖的类A、B、C,只需将所有类文件放入同一目录(或添加路径到MATLAB),在C#中即可按如下方式调用:
matlab.Execute("objA = A();"); matlab.Execute("result = objA.callMethodThatUsesB();"); matlab.GetWorkspaceData("result", "base", out value);
需要注意:MATLAB Engine会维护持续的工作区,创建的对象会一直存在,直到关闭引擎或手动清除(如matlab.Execute("clear obj"););同时要确保MATLAB的定时器等后台操作不会因引擎连接问题阻塞,你的MyClass定时器逻辑可正常运行,只要MATLAB引擎实例保持活跃。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

