• Matlab生成dll,C#调用


    版本:Matlab 2016a,VS2015

    一 Matlab 生成dll

    1 安装MCRInstaller

    安装包的位置就在matlab的安装目录下,(…R2016b oolboxcompilerdeploywin64)

    双击运行。此安装包主要是用于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文件在路径/addme2for_redistribution_files_only里;

            第二个文件是MWArray.dll(此文件的作用是c#与Matlab数据类型间的转换),路径是MATLABR2016b oolboxdotnetbuilderinwin64v2.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 untimewin64,MATLAB路径也最好添加MATLABR2016binwin64;环境变量不对会提示加载失败。

    然后再在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

  • 相关阅读:
    apache多端口映射
    mark
    一些注册表值
    jsp URL中文处理的几种方式
    【引用】雨林木风Ghost XP SP3系统
    CentOS常用命令
    查看ie8临时文件夹
    卡塔兰数
    大数问题
    不会做的题目
  • 原文地址:https://www.cnblogs.com/straight/p/14612246.html
Copyright © 2020-2023  润新知