首页 > 代码库 > C#与MATLAB混合编程--DLL动态调用

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

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