wdyjz 发表于 2007-11-19 09:45:48

技术挑战:M文件的.NET控件生成及调用(时间延长至2008.1.1前)

技术挑战:M文件的.NET控件生成及调用
时间:一周
开发软件版本:
matlab R2006a 或者更新的;
LabVIEW 7.0 or 更新;
visual studio .NET 2003或者2005
要求:将一个简单的matlab的M函数生成.NET控件,并在LabVIEW下调用。
比如:实现一个最简单的y=a+b;输入参数a,b;输出y,能实现最简单的加法运算1+2=3;
用途:以后可以将matlab的函数生成.NET控件,供LabVIEW调用,并脱离MATLAB的编程环境,便于系统集成。

看看谁能先攻破这个难点。首先攻破者加为精华贴。
同时附上最新用matlab R2007b生成的.NET控件,包含M程序和所有代码包。大家只需要调用里面的dotnetadd.dll作为.NET控件即可。

[ 本帖最后由 wdyjz 于 2007-11-23 10:43 编辑 ]

wdyjz 发表于 2007-11-19 09:47:18

提供一个数据类型的转换攻关!

在这个难题下最难做的是数据类型的转换,我先提供一个思路,其他朋友可以参考。因为我并没有真正攻破这个技术。
顺便附上一个我做的.NET控件
f=a+b

[ 本帖最后由 wdyjz 于 2007-11-19 16:30 编辑 ]

wdyjz 发表于 2007-11-19 16:28:15

我目前放弃攻关了,一直搞不定它

Matlab C/C++数学函数库中最基本的数据类型为矩阵对象,即mwArray类对象,几乎所有的库函数均以它们作为计算和处理的对象,掌握mwArray对象的操作,对于学习Matlab C/C++数学库的使用是至关重要的。
    Matlab C/C++数学库通过类mwArray对数值矩阵、稀疏矩阵、字符矩阵、单元矩阵和结构体矩阵提供了支持,矩阵对象的创建如下:

   
mwArray A; // 构造一个空矩阵对象
    mwArray A(double/int);   // 数子的矩阵对象
    mwArray A(int row, int col, double/int/unsigned short *real=NULL,
                                           double/int/unsigned short *image=NULL)
    mwArray A(const mwArray&)// 拷贝构造矩阵对象

    C/C ++调用Matlab函数将大量使用矩阵对象的索引操作,完成C/C++数据到mwArray对象的赋值和mwArray对象到C/C++数据的检索。 Matlab C/C++函数库提供ExtractScalar和ExtractData两个函数完成索引操作。另外用GetDate()和 mxGetPr、mxGetPi组合可以得到指向mwArray对象的数据的指针。

lgh269 发表于 2007-11-19 21:46:36

王兄,这个做好像对真正的应用计算适得其反,C/C++对于大量的数组及距阵式数据计算并不怎么样,只能是应用方便一些
.NET控件?不太明白为什么, :(

cpubbs 发表于 2007-11-20 11:29:13

为配合王兄的挑战,参加者并且做得好的朋友,送一个VIP虚拟仪器网店+联盟!呵呵!支持!

wdyjz 发表于 2007-11-20 16:21:37

Malab全球用的人太多了,尤其是所谓的教授、专家、博士等,其他LabVIEW他们估计也不怎么会用,毕竟在国内繁荣起来只是近几年的时间。我们如何吸收别人的精华并集成进来,而不让用户察觉到这个痕迹,当然要学会脱离matlab环境并集成技术为一个平台上来。这个很必要了,是原因之一。
.NET技术是微软VISTA的风行产品,有取代API技术之趋势,为了适合这个潮流,必须得掌握这个思想。这个是原因之二。

不过这个问题也是比较难的,本以为很简单,可是数据类型无法解决,卡住了。

lgh269 发表于 2007-11-20 19:00:18

嗯,了解了解:lol

yzmchinaren 发表于 2007-11-20 19:31:14

不难看出,王兄已经走在了技术的前沿!
学习中。。。期待高手....

wdyjz 发表于 2007-11-23 10:32:07

一周的时间估计无人能解决了

因短期内恐怕无人能解决这个问题,延长到年底先。看看哪位朋友能在2008年1月1日之前做出来。

飞雨天 发表于 2007-11-23 10:51:50

好啊~~~大家一起看看~那我还得先去学习下.net框架
不过我有下面的疑问:
1、matlab生成com不是很好吗?而且com的本意是组件开发,作为二进制的格式(与具体编程语言无关,与操作系统无关,封装编程语言特性),感觉这已经是个完美的解决方案了,为什么还要.net?当然,我知道现在.net很火热~~应该有他的理由;(好像这个我在那篇com的帖子里问过了,但这里再问一下-_-!);
2、本来还想问下为什么.net可以取代api,但想到自己对.net一无所知,还是先去看下比较好~

PS:最近论坛有难度的问题好像减少了很多,希望多出现这样的“挑战书”,呵呵~~
祝论坛越办越专业,越办越好,高手越来越多!

wdyjz 发表于 2007-11-23 22:47:49

mwArray是Matlab C++ 函数库中对mxArray的包装类 ,类的操作?怎么结合起来呢?数据类型

wdyjz 发表于 2007-11-24 09:40:31

COM和API相关
http://www.rxiao.com/collection/csdn/程序人生/661608.xml
VC6的核心就是两大类库:MFC和ATL,前者是基于win32 API的一种FrameWork,后者是开发COM组件的类库,两者开发的是传统的Windows应用程序,学VC不学MFC,不学ATL几乎可以说没学VC!但遗憾的是学VC的人没有几个不为MFC中那些复杂的类之间的关系,那些奇怪的代码而头痛,ATL也好不到哪去,如果你事先没系统地学习COM理论,用ATL来发基于COM的组件几乎是不可能的。事实上,MFC框架就是一种设计模式,只不过微软的开发人员将其设计得非常完善罢了。

sxd1988 发表于 2007-12-18 16:37:19

实现,但是做得比较简单,还没有深入研究。
这里利用了matlab中自带的mwArray.dll进行数据类型的转化.

各位请指点指点.

这里使用的是labview8.5,visual studio 2005,matlab r2007b

[ 本帖最后由 sxd1988 于 2007-12-18 17:32 编辑 ]

wdyjz 发表于 2007-12-18 19:08:31

我先看下,流程走的很对。前些日子,在.NET2005下我也用visual studio .net 2005直接用代码编程测试过调用matlab生成的.net 控件,流程和网上一个朋友写的程序一样,可仍然是提示调用错误。当时怀疑,matlab和visual studio安装的有问题。然后用labview测试,同样的错误提示。
这个程序我下载运行,仍然是提示出错,可能和我的系统有关吧,等测试成功后再交流。
http://bingfeng.blog.edu.cn/user1/9009/archives/2006/1579557.shtml (以前参考这个程序做的,并没有正确运行)
matlab builder for .net试用小结
彭哲, 2006-12-8下午,浙大求实园
今天心血来潮,来看看matlab7.3版本得matlab builder for .net对.net支持提高了多少
在过去的combuilder只能生成dll,所以如果在.net想调用该dll得话,还得按照dll得格式去调用,这与微软得技术路线不一致
下面来看下builder for .net
第一步:打开matlab builder for .net,在matlab下可通过命令deploytool来实现
第二步:新建deployment project,有4个选项,我们今天来测试for .net,假设项目名为untitled3
第三步:在untitled3class中添加m文件,比如我的test文件(这个文件在我前面得一篇matlab com builder文章中提到过http://bingfeng.blog.edu.cn/user1/9009/archives/2005/198777.shtml)
第四步:build the project
到此,.net文件已经制作完毕,下面来介绍下vs2003得c#调用此文件方法

第一步:新建c#工程以后,在解决方案资源管理器中添加引用MWArray,并到你生成的.net文件所在目录下添加你的.net文件,比如我所作的untitled3
并且在c#项目中using untitled3;
此时,你可以在对象浏览器中看到untitled3下面的untitled3class类,有成员public MathWorks.MATLAB.NET.Arrays.MWArray[] test
第二步:核心代码
private void button1_Click(object sender, System.EventArgs e)
{
   untitled3classdemo=new untitled3class();
   MathWorks.MATLAB.NET.Arrays.MWArray m=1,n=2;
   demo.test(m,n);
}
现在就一切ok了

[ 本帖最后由 wdyjz 于 2007-12-18 19:47 编辑 ]

wdyjz 发表于 2007-12-18 19:23:58

兄弟你把你做成功的图片截取一个传上来

adddoubles.vi中的Error creating instance of adddoublesclass in assembly adddoubles.adddoublesclass, adddoubles, Version=2.0.2907.43086, Culture=neutral, PublicKeyToken=null, (System.TypeInitializationException: The type initializer for 'adddoubles.adddoublesclass' threw an exception.
        Inner Exception: System.MissingFieldException: Field not found: 'MathWorks.MATLAB.NET.Arrays.MWArray.MCRAppInitialized'.
)
页: [1] 2
查看完整版本: 技术挑战:M文件的.NET控件生成及调用(时间延长至2008.1.1前)