C#与MATLAB混合编程--DLL动态调用

一、MATLAB生成C#可调用的DLL

  1. MATLAB生成C#可调用的DLL可以使用MATLAB提供的deploytool工具。在命令行中敲入deploytool就可以打开这个工具。MATLAB编译器可能会需要提前配置。
  2. 打开工具对话框后填写项目名称、路径,并在type选项中选择.NET Assembly,这个选项能够生成用于C#的DLL。
  3. 完成后再左侧的.NET Assembly选项卡中点击编辑Class名称,然后在其下添加响应的m文件,如果m文件引用了其它的m文件,可以将所有关联的文件一起加入。
  4. 最后点击build就启动dll生成。
  5. 生成后的dll文件放在之前选择的路径下的distrib目录下。

二、C#动态加载dll

DLL有两种类型,一种是托管dll,一种是非托管dll。对于非托管dll一般采用Dllimport的方式进行调用,例如系统API的kernel32.dll。

MATLAB生成的dll属于托管dll,这种类型的dll的调用方式比较简单。一种方式是在vs中的解决方案管理器中添加引用,并在代码中用using关键字对命名空间进行声明。

这样就可以使用其中的类和方法。

另一种方式是使用C#的反射器进行动态加载,这种方式的好处是操作灵活,扩展能力强,在实际应用中我们甚至可以利用Assembly类对dll进行探测,因此不用提前了解dll

内部提供的方法。下面是一个C#动态加载dll的代码实例:

  1. 首先在C#项目中加入MATLAB引用。在解决方案资源管理器中添加引用,在引用管理器中找到com选项里的Matlab Application Type Library选项,选中后添加。
  2. 在Matlab的安装目录中找到MWarray.dll,放到C#项目中的Debug文件夹下,然后将此加入引用。
  3. 在项目中添加对Reflection引用。using System.Reflection;

完成以上步骤后就可以开始实际代码的编写,实例方法如下

///m中的方法调用
   private object invo()
        {
            MWArray filename = @"E:\\l.DAT" ;   //M文件中的方法参数
            Assembly MyAssembly = Assembly .LoadFrom("testExample.dll");  //使用Assembly动态调用Matlab生成的dll
            Type[] types = MyAssembly.GetTypes();   //得到方法集合
            foreach (Type t in types)
            {
                if (t.Namespace == "testExample" && t.Name == "CTestExample")
                {
                    MethodInfo m = t.GetMethod("func_test_main" , new Type[] { typeof(MWArray ) });   //根据方法名称和方法中的参数去查找具体需要的方法
                    if (m != null )
                    {
                        object o = Activator .CreateInstance(t);    //生成对象实例
                        return m.Invoke(o, new object[] { filename });//调用方法
                    }
                }

            }
            return (object )0;
        }

关于Assembly的应用可参考这篇博文:http://www.cnblogs.com/rijing2004/archive/2007/08/07/reflection.html

时间: 2024-10-18 21:24:49

C#与MATLAB混合编程--DLL动态调用的相关文章

C++和MATLAB混合编程-DLL

先小话一下DLL,DLL是动态链接库,是源代码编译后的二进制库文件和程序接口,和静态链接库不同的是,程序在编译时并不链接动态链接库的执行体,而是在文件中保留一个调用标记,在程序运行时才将动态链接库文件加载入内存.并且DLL在运行时是共享的,即当多个程序调用时,内存中也只保持一份动态链接库. 动态链接库的调用有显式和隐式两种方式. 隐式链接需要用到我们前面生成的plotdata.c,plotdata.h,plotdata.lib以及plotdata.dll文件. 首先将plotdata.c,plo

C++和MATLAB混合编程-DLL篇

先小话一下DLL,DLL是动态链接库,是源代码编译后的二进制库文件和程序接口,和静态链接库不同的是,程序在编译时并不链接动态链接库的执行体,而是在文件中保留一个调用标记,在程序运行时才将动态链接库文件加载入内存.并且DLL在运行时是共享的,即当多个程序调用时,内存中也只保持一份动态链接库. 动态链接库的调用有显式和隐式两种方式. 隐式链接需要用到我们前面生成的plotdata.c,plotdata.h,plotdata.lib以及plotdata.dll文件. 首先将plotdata.c,plo

VC与Matlab混合编程之调用动态链接库dll(C++)——<二>

VC与Matlab混合编程之调用动态链接库dll--<二> 1.是先建立 matlab 的 m 文件. ellipsefit.m 其包含:function [Xc,Yc,A,B,Phi,P]=ellipsefit(x,y) 2.MCC命令编译生成得到h.dll.lib等文件 在matlab命令行中输入: mcc -W cpplib:ellipsefit ellipsefit.m -T link:lib (此方式为c++风格函数) (具体命令含义可参考<精通matlab与C/C++混合程序

VC++和Matlab混合编程(在VC中调用将.m文件生成的DLL)

这是师兄们在实际项目中用到的关于VC++和MATLAB混合编程的实例.最近自己在瞎鼓捣,也就研究了下这块,本想写篇博文,但网上这块的资料还算是比较多,写的也比较具体,想着不重复劳动,因此我也就不写了. //提取节点信息 mxArray *csd_path; mxArray *save_path; mxArray *mat_path=mxCreateCellMatrix(NULL,NULL);//mxCreateCellMatrix:创建二维单位矩阵 mxArray *analog=mxCreat

VS2013调用MATLAB混合编程

Visual Studio和MATLAB混合编程,有两种方法: 1 MATLAB调用C程序: 2 VS调用MATLAB(目前见到的都是VS,其他编译器如codeblocks,或不提供这项功能): 前一种是用MATLAB的mex命令调用VS或其他编译器,将以一定方式编写出的C文件编译成.mexw32(针对win32)或者.mexw64(针对win64),然后MATLAB就可以用调用动态链接库的方式,调用C程序.这一过程中,只需要在安装好编译器的前提下,执行: mex -setup 和 mbuild

c#与matlab混合编程探索

以下讲述如何使用c#来调用matlab函数实现北斗定位算法的仿真 1.准备 首先需要matlab2010,vs2010(其他版本是否可行,未知),另外需要安装matlab的辅助工具MCRInstaller(该工具无需下载,在安装好的matlab程序包中可以找到,例如:E:\matlab 2010\toolbox\compiler\deploy\win32) 2.准备matlab程序 上述截图是我的定位程序所涉及到的函数 3.matlab程序处理为dll文件,供c#调用,处理的基本步骤如下: (1

java/matlab混合编程应用移植到其他电脑上遇到的问题

问题1:jar包部署在其他电脑上设置vm参数无效 @echo off start java -Xmx1028M -Xms1028M -XX:PermSize=100M -XX:MaxPermSize=100M -XX:SurvivorRatio=8 -jar Edition_1.0_fat.jar 要把参数设置在前面才有效,开始把jar包放前面虽然自己电脑能运行但是其他人的电脑不能运行 问题2:# An unexpected error has been detected by HotSpot

C/C++与Matlab混合编程初探

欢迎转载,尊重原创,所以转载请注明出处. http://blog.csdn.net/bendanban/article/details/37830495 Matlab 拥有丰富的功能,编程简单.不过,有些情况下,Matlab程序的执行速度比较慢.C/C++编译执行的程序速度比较快,编程难度上比Matlab要高一些.因此存在一种方案,就是使用Matlab实现我们的实验程序,用C/C++来实现Matlab程序中比较耗时的部分,从Matlab程序中调用C/C++的程序以实现加速. 本文主要讲解如何在M

关于C++与Matlab混合编程错误??? Unexpected Standard exception from MEX file.

 最近在用c++和matlab 混合编程是遇到了一些问题,如下: ??? Unexpected Standard exception from MEX file. What() is:c:program Error in ==> mscale at 32 [rho,s] = matscale(abs(a),0.01); Error in ==> utScaledExpm at 7 [s,junk,a] = mscale(a,'noperm','safebal'); Error in ==&