zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Leetcode Unique Binary Search Trees
    Leetcode Decode Ways
    Leetcode Range Sum Query 2D
    Leetcode Range Sum Query
    Leetcode Swap Nodes in Pairs
    Leetcode Rotate Image
    Leetcode Game of Life
    Leetcode Set Matrix Zeroes
    Leetcode Linked List Cycle II
    CF1321A
  • 原文地址:https://www.cnblogs.com/straight/p/14612246.html
Copyright © 2011-2022 走看看