分享

Matlab与CSharp相互调用的一些知识

 maoj66 2014-03-09
C#与Matlab混合编程总结:
一、 C#调用Matlab函数
1.   动态链接库调用
①   制作matlab--M函数
②   >>mbuild –setup             选择VS2008
③   >>mcc -Bcsharedlib:**   **.m        **表示文件名
生成**.dll动态链接库
④   使用C#调用动态链接库的方式调用**.dll
附加特性说明:
usingSystem.Runtime.InteropServices;
[DllImport("**.dll")]
⑤   若调用失败,则是Matlab环境配置错误。
若已安装Matlab,请修改系统环境变量Path,
**\runtime\win32;**\bin\win32       **表示Matlab安装目录
若未安装Matlab,请安装Matlab运行环境,软件名为
“MCRInstaller.exe”
⑥   与matlab动态链接库数据交互
a.   **Initialize()  初始化Matlab运行环境
b.   **Terminate()   结束Matlab运行环境
c.   IntPtr           用此类型替代指针
d.   下面语句用于建立一个与Matlab进行数据交互的矩阵
[DllImport("libmx.dll")]
   static extern IntPtrmxCreateNumericMatrix(uint m, uint n, mxClassID classid, int flag);
    m*n表示矩阵维数,mxClassID表示矩阵种类,flag:0实数,1复数;
e.   下面定义的枚举类型用于表示矩阵种类
    public enum mxClassID
        {
            mxUNKNOWN_CLASS = 0,
            mxCELL_CLASS,
            mxSTRUCT_CLASS,
            mxLOGICAL_CLASS,
            mxCHAR_CLASS,
            mxVOID_CLASS,
            mxDOUBLE_CLASS,
            mxSINGLE_CLASS,
            mxINT8_CLASS,
            mxUINT8_CLASS,
            mxINT16_CLASS,
            mxUINT16_CLASS,
            mxINT32_CLASS,
            mxUINT32_CLASS,
            mxINT64_CLASS,
            mxUINT64_CLASS,
            mxFUNCTION_CLASS,
            mxOPAQUE_CLASS,
            mxOBJECT_CLASS, /* keep the lastreal item in the list */
        };
f.    下面语句用于提取矩阵中数据的首地址
[DllImport("libmx.dll")]
   static extern IntPtr mxGetPr(IntPtr pa);
g.   Marshal.Copy(…)  用于矩阵数据地址与C#中数组进行数据交互
h.   调用matlab函数时,返回值为矩阵的地址,通过下面的语句提取出矩阵。c表示输出矩阵。
//首先对输出进行初始化,初始化参数随意
IntPtrc = mxCreateNumericMatrix(0,0,0,0);
//调用结束后,c表示矩阵的地址,需调用下句更改c值
c= Marshal.ReadIntPtr(c);
2.   Matlab的 Engine调用
a. 动态链接库libeng.dll
[DllImport("libeng.dll")]
static extern IntPtr engOpen(string startcmd);
[DllImport("libeng.dll")]
static extern int engPutVariable(IntPtr ep,stringvar_name,IntPtr ap);
[DllImport("libeng.dll")]
static extern int engEvalString(IntPtr ep,stringstr);
[DllImport("libeng.dll")]
static extern IntPtr engGetVariable(IntPtr ep,stringname);
b. COM组件: 添加引用mlapp.tlb
MLAppClass ep= new MLAppClass();
ep.Visible =0;//隐藏engine窗口
ep.PutWorkspaceData("a","base", a);
object b;
ep.GetWorkspaceData("a","base", out b);
ep.Execute("figure");//执行字符串命令
ep.Quit();
3.   COM组件
找到文件夹F:\MATLAB\R2010a\runtime\win32
注册里面的文件 mwcomutil.dll  命令:regsvr32 mwcomutil.dll
>>deploytool
    修改name, Target->Generic COM Component
    Add class
    Add file
    Build
   
    在C#工程文件里引用COM组件,根据name找到自己定义的组件。
    若想删除组件,可以找到组件地址,然后regsvr32 /u **.dll
4.   .NET
>>deploytool
    修改name, Target->.net Assembly
    Add class
    Add file
    Build
在C#工程文件里引用->浏览,找到生成的目标 **.dll。
若想进行数据交互需 引用 net :MathWorks .net MWArray API
二、 Matlab调用C#代码
通过调用C#制作的COM组件实现。

  • C#制作COM
①.   新建类库
②.   属性设置:应用程序->程序集信息->使COM可见
生成 –> 为COM互操作注册
签名 –> 为程序集签名 –> 新建(无密码)
③.   代码实现,必须含有接口
publicinterface I**//定义接口
{
[DispId(0)]//方法前加其可见
Doubleadd(double a,double b);  //这是个例子
}

publicclass **:I**
{
    //写接口方法的实现
}
编译结束
④.   查看COM组件的信息,应用VC++6.0的工具OLE/COM Object Viewer
a.查看ProgID
ObjectClasses->Grouped by…->.Net…->**.$$   
**表示COM名字,$$表示类名
b.查看类中的方法
Type …->**->(右键)view      **表示COM名
⑤.   卸载COM
将属性设置     生成 –> 为COM互操作注册 取消
然后再次编译

  • Matlab调用COM
①. H =Actxserver(‘ProgId’)  //ProgId可以通过上面知识获取
返回类的实例。
②. H.get(‘method’,参数1,…)
    Method是实例内部方法,通过上面知识获取。后面为方法形参

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约