【问题标题】:C# Struct for Matlab functionMatlab 函数的 C# 结构
【发布时间】:2017-04-22 02:07:22
【问题描述】:

我有一个非常简单的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; }
        }
    }
}

不幸的是,这总是导致:

在 mscorlib.dll 中发生“System.ArgumentException”类型的未处理异常
附加信息:值不在预期范围内。

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

堆栈跟踪:

在 System.RuntimeType.InvokeDispMethod(String name, BindingFlags invokeAttr, Object target, Object[] args, Boolean[] byrefModifiers, Int32culture, String[] namedParameters) 在 System.RuntimeType.InvokeMember(字符串名称、BindingFlags bindingFlags、Binder binder、Object 目标、Object[] providedArgs、ParameterModifier[] 修饰符、CultureInfo 文化、String[] namedParams) 在 System.RuntimeType.ForwardCallToInvokeMember(字符串成员名称、BindingFlags 标志、对象目标、Int32 [] aWrapperTypes、MessageData 和 msgData) 在 MLApp.DIMLApp.Feval(字符串 bstrName,Int32 nargout,对象和 pvarArgOut,对象 arg1,对象 arg2,对象 arg3,对象 arg4,对象 arg5,对象 arg6,对象 arg7,对象 arg8,对象 arg9,对象 arg10,对象 arg11,对象arg12,对象 arg13,对象 arg14,对象 arg15,对象 arg16,对象 arg17,对象 arg18,对象 arg19,对象 arg20,对象 arg21,对象 arg22,对象 arg23,对象 arg24,对象 arg25,对象 arg26,对象 arg27,对象 arg28,对象 arg29、对象 arg30、对象 arg31、对象 arg32) 在 C:\Users{username}\documents\visual studio 2015\Projects\rmtest\rmtest\Program.cs:line 20 中的 rmtest.Program.Main(String[] args) 在 System.AppDomain._nExecuteAssembly(RuntimeAssembly 程序集,字符串 [] 参数) 在 System.AppDomain.ExecuteAssembly(字符串 assemblyFile,证据 assemblySecurity,String [] args) 在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在 System.Threading.ThreadHelper.ThreadStart_Context(对象状态) 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,ContextCallback 回调,对象状态,布尔值 preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态,布尔值 preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态) 在 System.Threading.ThreadHelper.ThreadStart()

【问题讨论】:

  • 您能否提供更多关于运行时异常的详细信息,例如完整的堆栈跟踪(或堆栈跟踪的相关部分)。
  • 我已经包含了堆栈跟踪。

标签: c# matlab marshalling


【解决方案1】:

这成功了:

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

【讨论】:

  • 这个技巧在我的机器上不起作用:System.Runtime.InteropServices.COMException:来自非结构数组对象的结构内容引用。 myFunc 中的错误(第 2 行)x = a + b + myStruct.score;
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 2010-11-10
  • 1970-01-01
相关资源
最近更新 更多