- MATLAB生成C#可调用的DLL可以使用MATLAB提供的deploytool工具。在命令行中敲入deploytool就可以打开这个工具。MATLAB编译器可能会需要提前配置。
- 打开工具对话框后填写项目名称、路径,并在type选项中选择.NET Assembly,这个选项能够生成用于C#的DLL。
- 完成后再左侧的.NET Assembly选项卡中点击编辑Class名称,然后在其下添加响应的m文件,如果m文件引用了其它的m文件,可以将所有关联的文件一起加入。
- 最后点击build就启动dll生成。
- 生成后的dll文件放在之前选择的路径下的distrib目录下。
二、C#动态加载dll
DLL有两种类型,一种是托管dll,一种是非托管dll。对于非托管dll一般采用Dllimport的方式进行调用,例如系统API的kernel32.dll。
MATLAB生成的dll属于托管dll,这种类型的dll的调用方式比较简单。一种方式是在vs中的解决方案管理器中添加引用,并在代码中用using关键字对命名空间进行声明。
这样就可以使用其中的类和方法。
另一种方式是使用C#的反射器进行动态加载,这种方式的好处是操作灵活,扩展能力强,在实际应用中我们甚至可以利用Assembly类对dll进行探测,因此不用提前了解dll
内部提供的方法。下面是一个C#动态加载dll的代码实例:
- 首先在C#项目中加入MATLAB引用。在解决方案资源管理器中添加引用,在引用管理器中找到com选项里的Matlab Application Type Library选项,选中后添加。
- 在Matlab的安装目录中找到MWarray.dll,放到C#项目中的Debug文件夹下,然后将此加入引用。
- 在项目中添加对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