2016-12-07 5 views
1

ich eine sehr einfache Matlab-Funktion haben:C# Struct für Matlab-Funktion

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

ich dann diese nennen von C# Ich versuche das, indem Sie folgende:

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

Leider ist diese immer in einem Ergebnis :

Eine nicht behandelte Ausnahme des Typs 'System.ArgumentException' ist in mscorlib.dll aufgetreten
Zusätzliche Informationen: Wert liegt nicht im erwarteten Bereich.

Wer hat irgendwelche Ideen, was ich verpasse? Ich folgte der Matlab-Dokumentation, die im Grunde gesagt, solange Sie ein öffentlich zugängliches Feld haben, dann sind Sie gut zu gehen.

Stacktrace:

bei System.RuntimeType.InvokeDispMethod (String name, Binding invokeAttr, Objekt Ziel, Object [] args, Boolean [] byrefModifiers, Int32 Kultur, String [] namedParameters) bei System. RuntimeType.InvokeMember (String name, BindingFlags bindingFlags, binding binder, Objekt target, Object [] bereitgestelltArgs, ParameterModifier [] Modifikatoren, CultureInfo Kultur, String [] namedParams) bei System.RuntimeType.ForwardCallToInvokeMember (String memberName, BindingFlags Flags, Object target , Int32 [] aWrapperTypes, MessageData & msgData) bei MLApp.DIMLApp.Feval (String bst rName, int32 nargout, Objekt & pvarArgOut, Objekt arg1, Objekt arg2, Objekt arg3, Objekt arg4, Objekt arg5, Objekt arg6, Objekt arg7, Objekt arg8, Objekt arg9, Objekt arg10, Objekt arg11, Objekt arg12, Objekt arg13, Objekt arg14 , Objekt arg15, Objekt arg16, Objekt arg17, Objekt arg18, Objekt arg19, Objekt arg20, Objekt arg21, Objekt arg22, Objekt arg23, Objekt arg24, Objekt arg25, Objekt arg26, Objekt arg27, Objekt arg28, Objekt arg29, Objekt arg30, Objekt arg31, Objekt arg32) bei rmtest.Program.Main (String [] args) in C: \ Benutzer {Benutzername} \ Dokumente \ Visual Studio 2015 \ Projekte \ rmtest \ rmtest \ Program.cs: Zeile 20 bei System.AppDomain ._nExecuteAssembly (RuntimeAssembly Montage, String [] args) bei System.AppDomain.ExecuteAssembly (String assembly, Evidence assemblySecurity, String [] args) bei Microsoft.VisualStudio.HostingProcess.HostP (Roc.RunUsersAssembly) bei System.Threading.ThreadHelper.ThreadStart_Context (Object state) bei System.Threading.ExecutionContext.RunInternal (ExecutionContext ExecutionContext, Contextcallback, Objektzustand, Boolean preserveSyncCtx) bei System.Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, Contextcallback, Objektzustand, Boolean preserveSyncCtx) bei System.Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, Contextcallback, Objektzustand) bei System.Threading.ThreadHelper.ThreadStart()

+0

Können Sie mehr Details aus der Laufzeitausnahme geben, wie der vollen Stack-Trace (oder dem entsprechenden Teil des Stack-Trace). –

+0

Ich habe die Stack-Trace enthalten. – TBD

Antwort

0

Dies tat der Trick:

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