有关Matlab VS c# 混合编程 程序运行出错的问题

我编程使用的系统和软件

系统:Win10 家庭版 64位

MATLAB:R2015b 64位

VS:VS10


0、前言

         编一个小的CAM,考虑到用到的函数可能比较复杂,而且后面可能需要修改,所以选择MATLAB编写函数,生成dll文件,然后用VS引用。第一次尝试这么整,踩了一些坑,就记录一下。具体如何生成dll以及添加引用可以参考如下,这里就不写了,只写碰到的问题。

c#调用matlab生成的dll_orangapple的博客-CSDN博客_c调用matlab生成的dll

Matlab2015编译生成Dll并在VS2010环境下应用的具体操作步骤(64位系统)_lanling1996的博客-CSDN博客_matlab生成64位dll

【C#】VS2015调用Matlab2016a生成的dll文件、MWArray数据类型转换_两个轮子的博客-CSDN博客

需要注意:MATLAB生成dll的时候必须在最下面 Additional Runtime Settings里面选择框架和VS保持一致(不要选择默认),否则VS运行会报错。

1、运行必须需要MCR

MCR是什么:MATLAB Compiler Runtime (MCR)

不安装的情况下,VS会报错无法运行调试。

如果没有安装MCR,直接在MATLAB安装目录就能找到安装包,然后安装,位置可以不是默认的。

我的MATLAB安装位置是D:\Program Files\MATLAB

MCR安装包位置:D:\Program Files\MATLAB\toolbox\compiler\deploy\win64

我的MCR安装在了:D:\Program Files\MATLAB\mcr

安装之后系统的环境变量会自动写入MCR位置:

2、运行程序的目标电脑上必须安装MCR,且版本必须和生成dll的MCR版本一致。

        程序编写完之后打包发给A电脑(Win7 MATLAB16),报错;再发给B电脑(Win11 MATLAB16a)同样报错如下:

提示 System.IO.FileNotFoundException: 未能加载文件或程序集“MWArray, Version=2.15.1.0

        在电脑B(Win11 MATLAB16a)上找到16a的MCR安装包,安装16a的MCR后仍然报错

        拷贝我电脑上15b安装路径里面的MCR给电脑B(Win11 MATLAB16a)安装之后,不报错。MCR的安装路径也不是默认的,但是注意:安装之后,安装路径会自动写在环境变量里面,所以如果1中的那个环境变量出问题了,还是不能运行的。

所以,用什么版本的MCR生成的DLL文件,目标电脑上就需要安装什么版本的MCR。


有关调用实时(JIT)调试而不是此对话框的详细信息,
请参见此消息的结尾。

************** 异常文本 **************
System.IO.FileNotFoundException: 未能加载文件或程序集“MWArray, Version=2.15.1.0, Culture=neutral, PublicKeyToken=e1d84a0da19db86f”或它的某一个依赖项。系统找不到指定的文件。
文件名:“MWArray, Version=2.15.1.0, Culture=neutral, PublicKeyToken=e1d84a0da19db86f”
   在 R2RLathe_CAM.MainForm.btn_YuRe_Click(Object sender, EventArgs e)
   在 System.Windows.Forms.Control.OnClick(EventArgs e)
   在 System.Windows.Forms.Button.OnClick(EventArgs e)
   在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   在 System.Windows.Forms.Control.WndProc(Message& m)
   在 System.Windows.Forms.ButtonBase.WndProc(Message& m)
   在 System.Windows.Forms.Button.WndProc(Message& m)
   在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

警告: 程序集绑定日志记录被关闭。
要启用程序集绑定失败日志记录,请将注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD)设置为 1。
注意: 会有一些与程序集绑定失败日志记录关联的性能损失。
要关闭此功能,请移除注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog]。


3、可能需要在指定位置复制dll文件

        我在执行2之后,上面的报错没了,但是程序仍然运行出错,报错内容如下:

报错:MWArray assembly failed to be initialized

        由于还是给别人调试,因此生成的时候选的控制台。但是在控制台里的内容看出了问题:

         控制台提示在我的“D: Program Files\MATLAB\bin”这个路径下面找不到引用?

        然后就在电脑B的对应路径新建文件夹,并复制了Debug里面的dll文件(也就是使用MATLAB生成的dll文件)问题就解决了。

        在电脑A上重复了刚才的流程,同样能够运行程序了。

所以做小界面,还没定型的时候整成控制台程序调试还是有好处的。。。

【这个问题的后续】————————————————

找了我一同学问了问,然后找到了matlabrc.m,在matlab安装路径里有,里面244行代码是

————————————————————————————
%修改Matlab默认工作路径
cd ('D:\Program Files\MATLAB\bin');

然后将这行代码注释了,再生成dll,再用VS引用,生成exe。再在另一台电脑上运行,没有报这个错误了~

4、跟生成的目标平台无关?

        我不是计算机专业的,一些知识不懂,还请各位大佬赐教。

        当时在碰到了2、3中的问题的时候,查了很多网站,有的说是生成的目标平台的问题。我同样试了,生成了一个是平台 (活动)X86、目标平台X86的exe;另一个是平台 活动(X86),目标平台X64的exe。

        再执行了2、3之后,两个exe都能够在电脑B上运行,电脑B上的MATLAB是64位的,系统也是64位的。我的电脑是能运行的,使用的是15b 64位,win10 64位的。

因此似乎跟生成的程序会报2、3中的错误与生成的目标平台无关。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值