2016-12-07 17 views
1

私は非常に単純なMATLAB関数を持っている:C#構造体が

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; } 
     } 
    } 
} 

残念ながら、これは常にAになり:

mscorlib.dllで 'System.ArgumentException'の未処理例外が発生しました
追加情報:値が予定範囲内に収まらない。

誰も私が逃しているアイデアはありますか?私は基本的にあなたが公にアクセス可能なフィールドを持っている限り、あなたが行くのが良いと言った、MATLABのドキュメントに従った。

のStackTrace:System.RuntimeType.InvokeDispMethodで

システムで (文字列名、のBindingFlags invokeAttr、オブジェクトのターゲットは、[]引数、ブール[] byrefModifiers、のInt32培養、文字列[] namedParametersオブジェクト)。 (String memberName、BindingFlags flags、Object target)RuntimeType.InvokeMember(String name、BindingFlags bindingFlags、バインダーバインダー、オブジェクトターゲット、ObjectArgs、ParameterModifier []修飾子、CultureInfoカルチャ、String [] namedParams) でSystem.RuntimeType.ForwardCallToInvokeMember 、Int32 [] aWrapperTypes、MessageData & msgData) 、MLApp.DIMLApp.Feval(String bst rname、Int32 nargout、オブジェクト& pvarArgOut、オブジェクトarg1、オブジェクトarg2、オブジェクトarg3、オブジェクトarg4、オブジェクトarg5、オブジェクトarg6、オブジェクトarg7、オブジェクトarg8、オブジェクトarg9、オブジェクトarg10、オブジェクトarg11、オブジェクトarg12、オブジェクトarg13、オブジェクトarg14 Object arg15、Object arg16、Object arg17、Object arg18、Object arg19、Object arg20、Object arg21、Object arg22、オブジェクトarg23、オブジェクトarg24、オブジェクトarg25、オブジェクトarg26、オブジェクトarg27、オブジェクトarg28、オブジェクトarg29、オブジェクトarg30、オブジェクトC:\ Users {username} \ documents \ visual studio 2015 \ Projects \ rmtest \ rmtest \ Program.csのrmtest.Program.Main(String [] args)の System.AppDomainの行番号 ._nExecuteAssembly(RuntimeAssemblyアセンブリ、String [] args) at System.AppDomain.ExecuteAssembly(String assemblyFile、Evidence assemblySecurity、String [] args) at Microsoft.VisualStudio.HostingProcess.HostP System.Threading.ExecutionContext.RunでSystem.Threading.ExecutionContext.RunInternal(のExecutionContextのExecutionContext、ContextCallbackコールバック、オブジェクト状態、ブールpreserveSyncCtx) (AT System.Threading.ThreadHelper.ThreadStart_Context(オブジェクトの状態) でroc.RunUsersAssembly() System.Threading.ThreadHelper.ThreadStartでSystem.Threading.ExecutionContext.Run(のExecutionContextのExecutionContext、ContextCallbackコールバック、オブジェクトの状態でのExecutionContextのExecutionContext、ContextCallbackコールバック、状態、ブールpreserveSyncCtxオブジェクト) ) ()

+0

完全なスタックトレース(またはスタックトレースの関連する部分)など、実行時例外の詳細を教えてください。 –

+0

私はスタックトレースを含めました。 – TBD

答えて

0

は、これはやりましたトリック:

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