C#調用由matlab生成的dll


暑假參加比賽時開發的winform程序里用到了matlab生成的dll,現在來總結一下具體過程。

 

我的開發環境是Visual Studio 2008和Matlab 2011

操作步驟:

1、matlab中安裝MCR

MCR是MATLAB程序的運行底層支持,它打包了MATLAB運行所必需的支持全部庫、組件,就像使用Visual Studio.net 發布的程序必須安裝Frame框架一樣。如果想在其他電腦上運行matlab文件,但是又沒有安裝matlab,則安裝MCR這個matlab的運行環境即可。

MCR不用自己下載,如果你已經安裝了matlab,在你安裝目錄中找MATLAB7\toolbox\compiler\deploy\win32 ,里面點擊MCRInstall 按提示安裝即可。

2、安裝matlab編譯器

安裝完MCR后,打開你的matlab,在命令窗口中輸入命令 mbuild-setup,設置編譯器,在設置過程中會出現選擇編譯器的提示

我電腦帶有的編譯器是 Microsoft Visual C++ 2008 SP1

因此選擇1即可,系統將自動安裝。

3、運行deploytool,編譯.net dll

寫好你在matlab中的程序,我以一個簡單的畫圖程序為例,程序內容是根據輸入數組A的數據,畫出直方圖,其中數組A(0)代表一班人數、A(1)代表二班人數依次類推。代碼如下。

function test(A)
t=[1,2,3,4,5,6];
bar(t,A)
set(gca,'XTickLabel',{'一班','二班','三班','四班','五班','六班'}) ;
set(gca,'xtick',1:6);
str=[num2str(A')];
text(t,A,cellstr(str))

 

 編寫成M文件后,在matlab命令窗口輸入命令deploytool,在彈出的窗口中輸入項目名、地址和編譯類型,我們選擇的是.NET Assembly

點擊確認后出現以下窗口

我們在編譯前要設置一下,點擊中的Settings

設置.NET,設置如上圖,選擇microsoft framwork版本時一定要選單前使用版本,不能選 default,要不然編譯出來的會有一點問題。將Assembly Type 設置為Shared點擊Close回到編譯窗口。

在編譯窗口中,Add Class 為設置類名,Add File選擇你的M文件,即編譯后在C#的類函數。設定完后點擊編譯即可。編譯結束后會在 test\src下會產生test.dll,這就是我們需求的 dll文件。

 4.打開VS建立C#項目,導入dll引用

如何導入dll引用?只需要對着自己的項目點右鍵,在右鍵菜單中點擊添加引用即可。注意,除了導入剛才自己生成的dll引用,你還需導入一個名為MWArray.dll的引用,他是matlab自帶的引用,你可以在[Matlab安裝位置]\R2009a\toolbox\dotnetbuilder\bin\win32\v2.0文件夾中找到。

添加完引用,當然不要忘了在類里using啦!在類開頭寫上

1 using MathWorks.MATLAB.NET.Arrays;
2 using MathWorks.MATLAB.NET.Utility;
3 using test;

 

5.C#編碼

在C#編碼中,我們調用matlab編寫的dll的類時,輸入與輸出返回的數據類型都為MWArray,那么這個MWArray類型如何和C#中的數據類型進行交互呢?我們要先學習下面的知識

matlab中的數據與c#中數據的傳遞

我們先了解一下MWNumericArray,它是MWArray與C#中數據傳遞的中間類。怎么用?怎樣在C#與matlab間傳遞參數?

a.double型、int型等數值類型的變量傳遞      

MWNumericArray i = null, result = mydouble;    
i=4;       
myClass myclass = new myClass(); //實例化   
result = (MWNumericArray)myclass.myfunc(i);

只要result轉換成MWNumericArray類,那么就好辦了,利用C#的轉換類型函數就能轉換成C#中的其他類型了,如Convert.ToDouble()一下就變成Double類型了。

b.字符串(需要用到MWCharArray和MWArray轉換)

MWCharArray FileName = myString; 
MWNumericArray sensitivity; 
sensitivity = (MWNumericArray)myClass.myAlgorithm((MWArray)FileName); 

 

c.多個輸出參數組成的數組

MWNumericArray out_Arr = (MWNumericArray)out_Args[1]; //取出第一個參數返回的數組(matlab返回的數組下界是從1開始的)

 

取出數組中的一個元素值

mydouble=out_Arr[i].ToScalarDouble(); 

 

如上面例子ToScalarDouble一類的toXXXX等方法還有許多。

d.result.toArray可以把matlab返回的矩陣變成C#的n*m數組,eg:

 double[,] csArray= (double[,])result.ToArray(MWArrayComponent.Real); 

 

e.將數組傳入Matlab(和傳遞單個數值的方法一樣)

double[,] dbx = new double[2, 2] { { 1, 2 }, { 3, 4 } }; 
MWNumericArray x=dbx; 
myclass.picture(x);

 

這樣針對你對數據類型的要求進行相應的轉換,就能在c#中調用matlab的dll來進行計算了。當然,如果你的c#程序發布出來后,要在其他電腦上運行,那么這台電腦除了要裝.net環境還要裝MCR環境。

參考文章:http://wenku.baidu.com/view/a20207e919e8b8f67c1cb982.html


免責聲明!

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



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