Matlab生成dll,C#調用


版本: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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM