C#脱离matlab环境调用matlab生成的dll

一、A电脑使用matlab编写C#动态dll

1.1检查matlab是否关联编译器

本人是Matlab + vs2017 ,在matlab命令行输入>>mbuild -setup,如下图所示
在这里插入图片描述
若是提示找不到编译器:本人Visual Studio版本为2017,而MATLAB R2017a存在小bug,如果想要用VS2017的编译器,需要打一个补丁。而MATLAB R2017b已经修复了这个bug。
在这里插入图片描述

mscv2017以及MWarray.dll下载链接:link
提取码:eqj3

1.2编写Matlab调用函数

我编写的是计算sin输出值
在这里插入图片描述

1.3使用deploytool命令生成dll

在命令行输入>>deploytool,出现如下图所示的窗口:
>>deploytool
选择Library Compiler
选择动态库编译
弹出dll参数设置界面
在这里插入图片描述
照如下步骤修改信息,最后生成dll文件。
在这里插入图片描述
在这里插入图片描述
出现如下等待界面。
在这里插入图片描述
最后生成的文件夹如下,选择for_…_only文件夹,
在这里插入图片描述
选择其中的testPlot.dll作为C#的引用dll文件。
在这里插入图片描述

二、B电脑安装MCR

根据计算机A上的的MATLAB版本到Mathworks官网下载对应版本的MCR,或者在计算机A上MATLAB命令行中执行如下命令:>>mcrinstaller


若是没有安装matlab,从这里下载Mcrinstaller.exe,本人是2017a版本的:
链接:link提取码:d74p

三、B电脑C#程序引用两个dll

3.1C#工程中使用生成的dll

首先引用MWArray.dll与生成的SinFunction.dll,然后使用三个命名空间
SinFunction
MathWorks.MATLAB.NET.Arrays
MathWorks.MATLAB.NET.Utility

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SinFunction;
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            SinPlot myPlot = new SinPlot();
            int[] Num = new int[10];
            for(int i = 0; i < 10; i++)
            {
                Num[i] = i;
            }
            MWNumericArray input = Num;
            MWNumericArray outPut;
            outPut = (MWNumericArray)myPlot.CsharpPlot(input);
            double[,] result = (double[,])outPut.ToArray();
            foreach (var item in result)
            {
                Console.WriteLine(item);
            }
        }
    }
}

运行结果:
在这里插入图片描述

3.2编译过程出现的问题:

1、MWarray.dll 版本不对
一定要与编译dll的A电脑中matlab路径下去找这个,否则版本会不一致
2、编译通过后,生成dll类的过程中失败,位数不一致导致的
在这里插入图片描述
3、命令空间识别但是dll类类型不识别。
.net FreameWork版本使用不对,编译的时候选择.net FreameWork 4。

四、缺陷

4.1编译位数问题

matlab64为生成64为dll,所以C#工程必须用64位编译
在这里插入图片描述

4.2,.net版本问题

若是使用了命令空间但是类型变量定义不识别,编译的时候选择.net FreameWork 4。
在这里插入图片描述

如有错误还请指出,感谢阅读。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值