C#和Matlab联合编程——调试结果中出现“System.IO.FileLoadException“类型的未经处理的异常在System.Windows.Forms.dll中发生错误。

问题描述:该项目是在VS2010,Matlab2015a的环境下调试成功的,而另一用户在VS2015和Matlab2016b的环境下直接运行,报出如下错误:

C#和Matlab联合编程——调试结果中出现“System.IO.FileLoadException“类型的未经处理的异常在System.Windows.Forms.dll中发生错误。_第1张图片

 

C#和Matlab联合编程——调试结果中出现“System.IO.FileLoadException“类型的未经处理的异常在System.Windows.Forms.dll中发生错误。_第2张图片 

问题分析:从错误提示的信息中可以看出,未能加载文件或程序集MWArray,Version=2.15.0.0,首先应先检查程序中是否缺少该程序集,本项目中已经正确引用该程序集,排除此原因;其次检查MWArray.dll及其他.dll文件的版本,版本不同,则VS不能正确调用对应的Matlab,进而引发未能加载文件或程序集。

解决方案:通过分析可知,该错误是因为该项目引用的MWArray.dll(Version=2.15.0.0)及一些.dll文件的版本是由Matlab2015a打包生成的,而现在要在VS2015的环境下使用这些.dll文件去调用Matlab2016b,这就会造成.dll文件和Matlab版本的不匹配,不能正常调用,解决方案如下:

使用Matlab2016b重新打包.M文件,生成对应的.dll文件,并且在VS2015中重新引用MWArray .dll(Version=2.16.1.0)和重新生成的.dll文件,这个问题就完美地解决了。

其中MWArray .dll的路径为:在Matlab的安装路径下matlab\toolbox\dotnetbuilder\bin\win64\v2.0

下面以对add.m程序打包并引用为例

使用Matlab2016b打包.M文件步骤如下: 

1.配置编译环境

在命令窗口输入“mbuild -setup”(语句中的-前面有空格),出现下图即为MBUILD配置成功。

C#和Matlab联合编程——调试结果中出现“System.IO.FileLoadException“类型的未经处理的异常在System.Windows.Forms.dll中发生错误。_第3张图片

 成功后在命令窗口输入“mex -setup C++”((语句中的-前面有空格),出现下图即为配置成功。

C#和Matlab联合编程——调试结果中出现“System.IO.FileLoadException“类型的未经处理的异常在System.Windows.Forms.dll中发生错误。_第4张图片

 Matlab2016b的编译环境配置成功。

2.编写.M文件

.M程序如下所示,函数功能就是求取两个数的和

C#和Matlab联合编程——调试结果中出现“System.IO.FileLoadException“类型的未经处理的异常在System.Windows.Forms.dll中发生错误。_第5张图片

3.将.M文件打包成.dll文件

在命令窗口中输入“deploytool”,出现如下窗口:

C#和Matlab联合编程——调试结果中出现“System.IO.FileLoadException“类型的未经处理的异常在System.Windows.Forms.dll中发生错误。_第6张图片

 选择“Library Compiler”,会出现Matlab Compiler页面,在此页面设置.dll文件的相关信息

C#和Matlab联合编程——调试结果中出现“System.IO.FileLoadException“类型的未经处理的异常在System.Windows.Forms.dll中发生错误。_第7张图片

 在1号位置选择“.NET Assembly”;

在2号位置添加编写的.M文件(本例为add.m);

在“Library information”这一栏3号位置编辑生成的.dll文件名(本例为add);

在“Namespace”这一栏的4号位置更改ClassName(一般避免直接使用默认名Class1,选用贴合程序、意思明确的名字,方便在C#代码中使用);5号位置可以看.M文件中函数的基本形式;

在6号位置选择对应的Microsoft Framework(本例选择4.0)。

.dll文件的基本信息设置完成后,点击右上角的Package进行打包。

出现如下窗口即为打包成功

C#和Matlab联合编程——调试结果中出现“System.IO.FileLoadException“类型的未经处理的异常在System.Windows.Forms.dll中发生错误。_第8张图片

 并且生产对应的文件夹

C#和Matlab联合编程——调试结果中出现“System.IO.FileLoadException“类型的未经处理的异常在System.Windows.Forms.dll中发生错误。_第9张图片

 其中,在for_redistribution_files_only文件夹目录下有生产好的add.dll文件

C#和Matlab联合编程——调试结果中出现“System.IO.FileLoadException“类型的未经处理的异常在System.Windows.Forms.dll中发生错误。_第10张图片

 这样就完成了.M文件的打包,下面就可以在VS2015中引用对应的.dll文件了

在VS2015中引用add.dll文件步骤如下:

 1.右击项目中的引用,选择添加引用;

C#和Matlab联合编程——调试结果中出现“System.IO.FileLoadException“类型的未经处理的异常在System.Windows.Forms.dll中发生错误。_第11张图片

2. 点击浏览,选取刚生成的add.dll文件,进行添加引用

C#和Matlab联合编程——调试结果中出现“System.IO.FileLoadException“类型的未经处理的异常在System.Windows.Forms.dll中发生错误。_第12张图片

 综上所述,按照add.m打包并引用的流程将那些.M文件都进行重新.dll并成功引用,还要引用Matlab2016b的MWArray.dll(在Matlab的安装路matlab\toolbox\dotnetbuilder\bin\win64\v2.0),完成所有文件的替换后,即可在VS2015和Matlab2016b的环境下运行该程序。

你可能感兴趣的:(matlab,c#)