C#调用matlab编译的DLL

本文介绍了如何将matlab中的函数封装成DLL,并在C#中调用。

1、准备打包的函数,将matlab中生成Butterworth滤波器系数的函数进行封装。

function out = getFilterCoe(N,wn)
[num,den] = butter(N,wn);
out = [num,den];
end

2、在matlab中输入"libraryCompiler"打开MATLAB Compiler
(1) 第1步选择".NET Assembly";
(2) 第2步通过右侧的"加号"选择文件"getFilterCoe.m";
(3) 第3步修改输出的DLL的名称,此处DLL名称为"Butterworth";
(4) 第4步修改类的名称为"FilterCoe";
(5) 第5步点击"Package"开始打包。

C#调用matlab编译的DLL_第1张图片

3、打包完成后当前文件夹下生成了一个名为"getFilterCoe"的目录,该目录下有三个文件夹和一个文件。

C#调用matlab编译的DLL_第2张图片

(1) for_redistribution目录下是一个名为MyAppInstaller_web.exe的程序,该程序引导式的安装生成的DLL和MATLAB的runtime。
(2) for_redistribution_files_only目录包含了部署所需要的文件。
(3) for_testing除了部署所需文件之外,还提供了一些源码。
(4) PackagingLog.html是打包日志。

4、创建C#项目
项目中引用"MWArray.dll"和for_redistribution_files_only目录中的"Butterworth.dll",其中"MWArray.dll"位于C:\Program Files\MATLAB\R2018a\toolbox\dotnetbuilder\bin\win64\v4.0\MWArray.dll

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MathWorks.MATLAB.NET.Arrays;
using Butterworth;
namespace Butterworth
{
    class Program
    {
        static void Main(string[] args)
        {
            double fs = 2048;
            double cutoff = 512;
            FilterCoe filter = new FilterCoe();
            MWArray N = 4;
            MWArray wn = cutoff / (fs / 2);
            MWArray SOS = filter.getFilterCoe(N, wn);
            double[,] coe = (double[,])SOS.ToArray();
            Console.WriteLine(coe.Length);
            Console.ReadKey();
        }
    }
}

5、错误处理

FilterCoe filter = new FilterCoe(); 这一句可能会报下面的错误。

C#调用matlab编译的DLL_第3张图片

查看错误详细信息发现是由于找不到"mclmcrrt9_4.dll"导致的

C#调用matlab编译的DLL_第4张图片

解决方法:安装对应matlab版本的MCR(Matlab compiler runtime),重启VS即可。
MCR下载地址: https://ww2.mathworks.cn/products/compiler/matlab-runtime.html

你可能感兴趣的:(C#调用matlab编译的DLL)