版本:Matlab 2016a,VS2015
一 Matlab 生成dll
1 安裝MCRInstaller
安裝包的位置就在matlab的安裝目錄下,(…R2016b\toolbox\compiler\deploy\win64)
雙擊運行。此安裝包主要是用於matlab打包文件所用。
2 編寫matlab函數文件
function [result,absResult] = addme2(a,b) switch nargin case 2 result = a + b; case 1 result = a + a; otherwise result = 0; end if nargout > 1 absResult = abs(result); end
3 用matlab將函數打包為C#可調用的dll文件
- 命令行輸入deploytool
- 選擇library complier
- 選擇指定項、添加自己的.m文件(如果有多個.m文件,在第二步全部添加即可)、修改類名(可改可不改,c#中調用時會用)
- 選擇package,選擇保存路徑后, 進入打包過程,等待完成即可。
4 生成的addme2.dll文件在路徑/addme2\for_redistribution_files_only里;
第二個文件是MWArray.dll(此文件的作用是c#與Matlab數據類型間的轉換),路徑是MATLAB\R2016b\toolbox\dotnetbuilder\bin\win64\v2.0
二 vs調用dll
1 引用右擊添加兩個dll文件,注意兩個dll文件不能放在系統C盤里;
2 using添加,
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility; using addme2; namespace WindowsFormsApplication3 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Class1 b = new Class1(); this.textBox1.Text = b.addme2((MWArray)6).ToString(); } } }
3 C#類型轉換
無法將類型“double[]”隱式轉換為“MathWorks.MATLAB.NET.Arrays.MWArray,用MWNumericArray。
MWNumericArray是MVArray的派生類。在VS的對象瀏覽器中查看了MWNumericArray各種構造方法,其中有一個構造方法是這樣的:
public MWNumericArray(MathWorks.MATLAB.NET.Arrays.MWArrayComplexity complexity, params int[] dimensions)
輸入的第一個參數是枚舉型參數,有兩個值分別是Real,另一個是Complex;然后輸入矩陣的維數,由於有params關鍵字,所以可以創建指定大小矩陣。
//使用構造方法,構造一個10行2列的實數矩陣,使用for循環給每一個元素賦值 MWNumericArray plotValue = new MWNumericArray(MWArrayComplexity.Real, 10, 2);
注意Matlab中矩陣的下標是從1開始的,而C#是從0開始的。
把這個double數組強制轉換成MWArray卻是總是提示編譯錯誤,無法進行強制類型轉換。
解決:MWNumericArray賦給double[]的話可以采用MWNumericArray的ToArray方法。double[]賦給MWNumericArray直接賦值。
double[] arr = new double[] { 1, 2 }; double[] arr1 = new double[3]; MWNumericArray temp = arr; arr1 = (double[])temp.ToArray(MWArrayComponent.Real);
三 問題
1 對mwcomutil.dll進行注冊
先在電腦的高級設置的環境變量里添加MCR的安裝路徑MATLAB\runtime\win64,MATLAB路徑也最好添加MATLAB\R2016b\bin\win64;環境變量不對會提示加載失敗。
然后再在cmd(管理員)窗口輸入:
regsvr32 mwcomutil.dllz
(這個dll是matlab下作的任何com組件都要用到的dll),下面在其他編譯器下調用時就可以用了。
不過,我運行
regsvr32 /u mwcomutil.dll
取消注冊后程序仍能運行。(不清楚)
2 程序報錯“addme2.Class1”的類型初始值設定項引發異常
x86修改為x64
https://blog.csdn.net/pitt_xiong/article/details/7777879
https://blog.csdn.net/qq_42063091/article/details/90702075