2) 上面的ctf其实是包含在dll程序集里面的,以资源的形式,这个文件是核心,它才真正的包括了Matlab编译之后的,MCR可以运行的中间程序。
3) 必须要合法正确的ctf文件和dll文件才能 正确的初始化mcr对象,合法的意思,是Matlab内部有校验机制,包括对相关版本,在以前的版本生成文件中,很明显,现在2012a里面都隐藏起来了,不过要求都一样。
4) 上面方法其实已经间接的告诉了我们怎么初始化mcr对象,有了mcr对象,一切都好办了,因为它才是MCR的核心。
3.PlotTest封装的方法代码
1publicvoid PlotTest() 2 {
3 mcr.EvaluateFunction(0, \, new MWArray[]{}); 4 }
5publicvoid PlotTest(MWArray n) 6 {
7 mcr.EvaluateFunction(0, \, n); 8 }
9public MWArray[] PlotTest(int numArgsOut) 10 { 11return mcr.EvaluateFunction(numArgsOut, \, new MWArray[]{}); 12 }
13public MWArray[] PlotTest(int numArgsOut, MWArray n) 14 {
15return mcr.EvaluateFunction(numArgsOut, \, n); 16 }
看了字段代码,再对应mcr的初始化,其实都很明朗了。通过mcr的EvaluateFunction来调用M函数。上面的代码有几个重载方法,可以实用很多不同的情况,有时候,这些方法的个数会更多,其实没多大必要,也可以自己编译一下,把没用的删掉,保留少数几个有用的即可。同时也可以看到,这里直接通过字符串来传递函数名称的,因此必须保证这个函
数能被mcr搜索到。比如我们这里的\这个函数其实就包含了ctf文件中(注意ctf文件是可以和dll分开的,在混编项目里可以设置)。
回到目录
3.上述代码到内置函数的调用
上述已经讲解了整个mcr调用的过程,其实就是通过mcr的EvaluateFunction来调用M函数,但要保证对于的函数名称在mcr搜索的范围内。那么我们是不是可以假设:内置函数都在MCR内部,应该是可以搜索到的,那么把上面的函数名称换一下,是不是也是可行的。这个假设也是我最早接触时候的想法,有了假设,当然要去验证。现在看来这个当然是肯定的,那么不妨重新演示一遍。过程不详细讲了,代码也有注释,混编要引用的MWArray.dll和命名空间也不提了,看代码:
1using System;
2using System.Collections.Generic; 3using System.Linq; 4using System.Text;
5using System.Reflection; 6using System.IO; 7
8using MathWorks.MATLAB.NET.Utility; 9using MathWorks.MATLAB.NET.Arrays; 10 11
12namespace BuildInFunctionDemo 13 {
14class Program 15 {
16static MWMCR mcr;
17staticvoid Main(string[] args) 18 {
19#region 首先使用PlotTest.dll来初始化mcr,因为这个dll是混编“合法”产生的,只有这样才能顺利启动mcr
20if (MWMCR.MCRAppInitialized) 21 {
22string path = Path.Combine(System.Environment.CurrentDirectory, \);
23 Assembly assembly = Assembly.LoadFile(path); 24string ctfFilePath = assembly.Location;
25int lastDelimiter = ctfFilePath.LastIndexOf(@\);
26 ctfFilePath = ctfFilePath.Remove(lastDelimiter, (ctfFilePath.Length - lastDelimiter)); 27string ctfFileName = \;
28 Stream embeddedCtfStream = null; 29 String[] resourceStrings = assembly.GetManifestResourceNames(); 30
31foreach (String name in resourceStrings) 32 {
33if (name.Contains(ctfFileName)) 34 {
35 embeddedCtfStream = assembly.GetManifestResourceStream(name); 36break;
37 } 38 }
39 mcr = new MWMCR(\,ctfFilePath, embeddedCtfStream, true);
40 } 41else
42 {
43thrownew ApplicationException(\initialized\); 44 } 45#endregion 46
47#region 直接调用混编dll中的封装函数进行测试
48 mcr.EvaluateFunction(0, \, 5); 49
50//注意这里要断点调试才能看到效果哦,因为mcr会把图绘制在一个Figure上面,
51//后面的会覆盖前面的,这里暂停一下,可以看前面的效果 52//下面就是直接调用matlab的plot函数的效果
53 MWNumericArray x = newdouble[]{1,2,3,4,5};
54 MWNumericArray y = newdouble[]{2,1,2.8,5.3,4.7}; 55 mcr.EvaluateFunction(0, \,x,y ); 56#endregion
57
58 Console.ReadKey(); 59 } 60 } 61 }
唯一要注意的就是50-52的说明,要加断点看2次绘制的效果。分别截图如下: