另一種混合編程方式——NET組件,利用m文件生成dll再由C#調(diào)用。.NET組件較之引擎的優(yōu)點(diǎn)是可移植型較好,目標(biāo)機(jī)不需要安裝Matlab,只需要安裝MCRinstaller.exe及dll的注冊,缺點(diǎn)是配置較為復(fù)雜,受各種版本的影響。遇到一大圈的問題,最可能的原因是VS2013版本比較新,但最后還是一個(gè)個(gè)問題克服,正所謂,柳暗花明又一村。
配置環(huán)境:vs2013(64位)+Matlab2013a(64位)+win8.1(64位)
1.定義Matlab文件,myplus.m
function [s]
% calculate the sum of 1..n
s = 0;
for i = 1:n
end
2.Matlab編譯器設(shè)置
在command window中配置分別配置>>mbuild–setup和>>mex–setup.
編譯器均選擇 VS2013
問題:matlab在關(guān)聯(lián)編譯器的時(shí)候,會出現(xiàn)找不到編譯器的問題
原因:matlab要找windowssdk的mt.exe,找不到報(bào)錯(cuò)的.因?yàn)?/span>vs2013在安裝時(shí),windowssdk的mt.exe位置變了,而matlab還是按照老的路徑找,肯定找不到(原來在windowssdks下面,現(xiàn)在在windowskits下面).
解決:網(wǎng)上找到相應(yīng)文件,將mbuildopts和mexopts兩個(gè)文件夾復(fù)制到(matlabroot)\bin\win64 下,(matlabroot)是matlab的安裝目錄
在command window中>>deploytool。先創(chuàng)建project,選擇.NETAssembly類型;然后把myplus.m文件添加到project里面,然后點(diǎn)上面菜單條上的buildthe project
3.環(huán)境安裝及dll注冊
需要安裝MCRinstaller.exe(本機(jī)則不需要),它所在的位置是:C:\ProgramFiles\MATLAB\R2013a\toolbox\compiler\deploy\win64;
在路徑C:\ProgramFiles\MATLAB\R2013a\bin\win64里,對mwcomutil.dll進(jìn)行注冊(這個(gè)dll是matlab下作的任何com組件都要用到的dll),下面我們在其他編譯器下調(diào)用時(shí)就可以用了。regsvr32mwcomutil.dll
問題:提示錯(cuò)誤為注冊dll模塊的原因(Error:DllRegisterServer in E:\Matlab2010b\bin\test\src\test_1_0.dllfailed)
解決:點(diǎn)“開始”->“Windows系統(tǒng)”->“命令提示符”右鍵“以管理員身份運(yùn)行”,在cmd中輸入regsvr32mwcomutil.dll 。這樣應(yīng)該就可以了。
4.dll引用
從C:\ProgramFiles\MATLAB\R2013a\toolbox\dotnetbuilder\bin\win64\v2.0復(fù)制出MWArray.dll到debug目錄下,從HelloNet\distrib里的HelloNet.dll復(fù)制到debug目錄下。然后添加引用,瀏覽debug目錄。
5.在c#中簡單做一個(gè)windowsapplication
程序中需要引用的命名空間有:
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
using dlldemo;
在按鈕事件里的代碼是:
private void button1_Click(objectsender,EventArgs e)
問題:C#在調(diào)用dll初始化matlab生成的類時(shí),總是提示:typeInitializationexception類型初始化設(shè)定異常,網(wǎng)上找了好久,試了個(gè)各種解決方法
解決:原來是在build dll時(shí),選擇的.m文件的所在路徑不能包含中文/空格,我把.m文件直接移到了根目錄下的某個(gè)不含空格和中文的文件夾下,然后把在這個(gè)文件夾下的.m文件拖到myTest.prj中,build,VS中重新引用生成的新的dll,發(fā)現(xiàn)程序正確。
問題:在整個(gè)過程中,運(yùn)行程序還是會出現(xiàn)問題,Matlab不能工作,如圖:
原因:.NET版本的問題,及調(diào)試的問題
解決:將.NET設(shè)置成4.0及其以下,
同時(shí),將調(diào)試中的啟用Visual Studio 承載進(jìn)程取消掉,如下圖
最后的最后,終于有結(jié)果了!激動人心啊~