我编程使用的系统和软件
系统: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位的。