从C#调用mexCallMATLAB

时间:2015-07-29 14:50:40

标签: c++ matlab pinvoke mex dllexport

我正在尝试使用Pinvoke从C#调用Matlab函数。

我的项目配置是:

  • C ++项目使用“mex.h”来调用“mexCallMATLAB”接口

示例:

#include "stdafx.h"
#include <stdarg.h>
#include <string>
#include "matrix.h"
#include "mex.h"

extern "C" _declspec(dllexport) bool blockExists()
{
    std::string blockPath = "model/myblockpath";
    mxArray *pin[1];
    int nin = 1; 
    mxArray *pout[1];
    int nout = 1;
    pin[0] = mxCreateString( blockPath.c_str() );
    if ( mexCallMATLAB( nout, pout, nin, pin, "find_system" ) != 0 ) {
        callStatus = false;
    }
    mxDestroyArray( pin[0] );
    return callStatus;
}
  • 使用PInvoke调用以前的c ++项目的C#项目

示例:

    using System.Runtime.InteropServices;

    namespace ManagedMatlabWrapper
    {
        public class MatlabWrapper
        {
            [DllImport(@"MatlabAPI.dll")]
            private static extern bool blockExists();

            public static bool blockExistsAPI()
            {
                bool result = blockExists();
                return result;
            }
        }
    }

一切都好了

但是当我运行代码时,它会给我一个DLL未找到异常的错误。

我检查了使用依赖性walker生成的DLL,它显示找不到某些Matlab DLL。如果我更改代码并删除对Matlab的任何引用,Pinvoke运行就好了。

enter image description here

有谁知道丢失了什么?如何从c#调用mexCallMATLAB?

2 个答案:

答案 0 :(得分:2)

除非通过MEX文件从MATLAB进程调用,否则mexCallMATLAB不会工作。没有这个,有太多未初始化的背景。因此,即使您在搜索路径上获得了正确的DLL,当您尝试执行它时它也会崩溃。

听起来你可能会更好地关注MATLAB Engine APIMATLAB COM Automation Server

答案 1 :(得分:0)

错误告诉您并非所有依赖项都可以找到。您的描述表明您的C ++ DLL已找到。但它反过来依赖于libmexlibmxmsvcr90。部分或全部这些依赖项无法解析。

解决问题的一种廉价(和肮脏)方法是将包含MATLAB库的目录添加到PATH。更好的方法是在第一个导致MATLAB的p / invoke调用之前,使用调用SetDllDirectoryAddDllDirectory修改DLL搜索路径。

可以通过为该版本的MSVC安装MSVC可再发行组件来解决MSVCR90的问题。

最后,MATLAB通过.net程序集公开了它的功能。为什么不使用它们来避免所有这些复杂性。