C#调用Matlab的DLL问题。

spade24 2011-01-05 03:31:30
1、生成M文件,文件内容如下:

function y = myplus(x, y)
z = x + y ;


2、使用mcc生成DLL文件,如mypluslib.dll;

3、在C#工程里调用DLL里面的方法“mlfMyplus(1, ref mx_y, mx_a, mx_b);”跳出异常:

AccessViolationException: 尝试读取或写入受保护的内存。


查看一些资料,都没提到会有这样的异常,应该是哪里问题呢?
...全文
357 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
jonnorth 2011-02-22
  • 打赏
  • 举报
回复
我想调的是图怎么办
jonnorth 2011-02-22
  • 打赏
  • 举报
回复
mcc 产生的DLL是给matlab自身用的 要给c#调用的dll得用comtool
spade24 2011-01-07
  • 打赏
  • 举报
回复
雨师88 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 spade24 的回复:]

引用 4 楼 zhaogaohong 的回复:
可能是你在matlab中写这个函数时有问题


“comtool”和“mcc -B csharedlib:mypluslib myplus.m”两者有什么区别,我是用后者的。
[/Quote]

我对matlab也是菜鸟级别,只知道写函数,然后转成dll
spade24 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wangshunqi1234 的回复:]
参数前面加上都加上 ref试试
[/Quote]
DLL里的方法“function test(h,D)”并没有ref,所以应该不是这个原因哦。
王顺起 2011-01-06
  • 打赏
  • 举报
回复
参数前面加上都加上 ref试试
spade24 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhaogaohong 的回复:]
可能是你在matlab中写这个函数时有问题
[/Quote]

刚刚我把你给的例子试了一下,在最后“st.test(m,n);”会跳出异常:
Function 'uminus' not defined for variables of class 'int32'.
spade24 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhaogaohong 的回复:]
可能是你在matlab中写这个函数时有问题
[/Quote]

“comtool”和“mcc -B csharedlib:mypluslib myplus.m”两者有什么区别,我是用后者的。
雨师88 2011-01-06
  • 打赏
  • 举报
回复
主要思想就是首先把matlab的m函数做成com组件,然后在c#中应用此com组件,即可。

主要步骤如下:
1.建一个m文件(test.m)
例如:
function test(h,D)
for x=-10:0.1:10,
if x>D
y=h;
hold on;
plot(x,y)
elseif x<-D
y=-h;
hold on;
plot(x,y)
else
y=h/(D*x);
hold on;
plot(x,y)
end
end

2.在matlab中输入comtool命令,就打开了matlab com builder,

点击file-new project,新建一个工程,

在component name里输入名字 点击ok就行了。

然后点击project--Add files,将test.m添加入工程,

然后点Build-Com Object,就会在comtest\distrib\文件夹下生成一个test1_0.dll(它就
是做好的com组件),

Build时matlab已经自动将此dll在注册表中注册

我们还需做一个准备工作,进入<matlabroot>/ bin/win32目录下(matlabroot为你机器上
matlab安装的路径),打regsvr32 mwcomutil.dll ,即对mwcomutil.dll进行注册(这个dll
是matlab下作的任何com组件都要用到的dll),下面 我们在其他编译器下调用时就可以用了



3.c#下实现调用

新建一个c#项目(我采用的是vs.net2003),选中右边的解决方案资源管理器中的引用
,点鼠标右键,选添加引用,在弹出来的窗口中选com,然后也找到test_1_0 .dll,点选
择,然后确定就可,此时此com组件也添加到工程里面去了,同样我们可以选择


然后编写程序

test.testclassClass st=new test.testclassClass();
object m=1,n=2;
st.test(m,n);
即可
雨师88 2011-01-06
  • 打赏
  • 举报
回复
可能是你在matlab中写这个函数时有问题
spade24 2011-01-06
  • 打赏
  • 举报
回复
spade24 2011-01-06
  • 打赏
  • 举报
回复
spade24 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zhaogaohong 的回复:]
引用 6 楼 spade24 的回复:

引用 4 楼 zhaogaohong 的回复:
可能是你在matlab中写这个函数时有问题


“comtool”和“mcc -B csharedlib:mypluslib myplus.m”两者有什么区别,我是用后者的。


我对matlab也是菜鸟级别,只知道写函数,然后转成dll
[/Quote]

上面你写的例子,我这边试过,后面有跳异常,是哪里的原因?
在最后“st.test(m,n);”:
Function 'uminus' not defined for variables of class 'int32'.
spade24 2011-01-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wang329382414 的回复:]
myplus(ref x, ref y) 试试
[/Quote]

mlfMyplus是mypluslib.dll里的一个函数!
wang329382414 2011-01-05
  • 打赏
  • 举报
回复
myplus(ref x, ref y) 试试

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧