关于matlab与c#混合编程的问题(8)

2025-06-28

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次绘制的效果。分别截图如下:


关于matlab与c#混合编程的问题(8).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《天作之合》中西合璧婚礼主持词

相关阅读
本类排行
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 7

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219