用于 Matlab 函数的 C# 结构

C# Struct for Matlab function

我有一个非常简单的matlab函数:

function [x,y] = myfunc(a,b,myStruct) 
x = a + b + myStruct.score; 
y = sprintf('Hello %s',myStruct.name); 

然后我尝试通过执行以下操作从 c# 调用它:

class Program
{
    static void Main(string[] args)
    {
        MLApp.MLApp matlab = new MLApp.MLApp();
        matlab.Execute(@"c:\matlab");
        object result = null;
        var student= new Student {grade = "A", name = "StudentName", score = 90};
        matlab.Feval("myfunc", 2, out result, 3.14, 42.0, student);
        var res = result as object[];
    }
    public struct Student
    {
        public string name;
        private string gr;
        private int sc;
        public string grade
        {
            get { return gr; }
            set { gr = value; }
        }
        public int score
        {
            get { return sc; }
            set { sc = value; }
        }
    }
}

不幸的是,这总是导致:

An unhandled exception of type 'System.ArgumentException' occurred in mscorlib.dll
Additional information: Value does not fall within the expected range.

有人知道我错过了什么吗?我遵循了 matlab 文档,它基本上说只要你有一个可公开访问的字段,那么你就可以开始了。

堆栈跟踪:

at System.RuntimeType.InvokeDispMethod(String name, BindingFlags invokeAttr, Object target, Object[] args, Boolean[] byrefModifiers, Int32 culture, String[] namedParameters) at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData) at MLApp.DIMLApp.Feval(String bstrName, Int32 nargout, Object& pvarArgOut, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7, Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14, Object arg15, Object arg16, Object arg17, Object arg18, Object arg19, Object arg20, Object arg21, Object arg22, Object arg23, Object arg24, Object arg25, Object arg26, Object arg27, Object arg28, Object arg29, Object arg30, Object arg31, Object arg32) at rmtest.Program.Main(String[] args) in C:\Users{username}\documents\visual studio 2015\Projects\rmtest\rmtest\Program.cs:line 20 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()

这成功了:

IntPtr pnt = Marshal.AllocHGlobal(Marshal.SizeOf(student));
matlab.Feval("myfunc", 2, out result, 3.14, 42.0, pnt);