我正在尝试使用Pinvoke从C#调用Matlab函数。
我的项目配置是:
示例:
#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;
}
示例:
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运行就好了。
有谁知道丢失了什么?如何从c#调用mexCallMATLAB?
答案 0 :(得分:2)
听起来你可能会更好地关注MATLAB Engine API或MATLAB COM Automation Server。
答案 1 :(得分:0)
错误告诉您并非所有依赖项都可以找到。您的描述表明您的C ++ DLL已找到。但它反过来依赖于libmex
,libmx
和msvcr90
。部分或全部这些依赖项无法解析。
解决问题的一种廉价(和肮脏)方法是将包含MATLAB库的目录添加到PATH
。更好的方法是在第一个导致MATLAB的p / invoke调用之前,使用调用SetDllDirectory
或AddDllDirectory
修改DLL搜索路径。
可以通过为该版本的MSVC安装MSVC可再发行组件来解决MSVCR90
的问题。
最后,MATLAB通过.net程序集公开了它的功能。为什么不使用它们来避免所有这些复杂性。