WPF应用程序调用MATLAB编译生成的DLL动态链接库 - 测试记录

新的运动学解算最初是在MATLAB上编写,方便绘图进行测试和验证。其中的线性代数运算转为C较为麻烦,故先进行MATLAB编译DLL,并由WPF调用的测试,验证WPF上位机直接调用从MATLAB代码编译DLL的可行性。

MATLAB编译dll

参考:https://blog.csdn.net/weixin_39559414/article/details/95059135

引用dll

引用MATLAB编译生成的dll以及编译该dll对应版本的MATLAB的MWArray.dll,否则会报错:MWArray的版本号不对。

编译WPF程序

1、编译报错,无法加载“mclmcrrt9_8.dll”:

解决方法:需要到matlab官网下载相应版本的MCR (https://ww2.mathworks.cn/products/compiler/matlab-runtime.html)

2、编译报错,各种奇怪的异常:

解决方法:将VS编译环境修改为x64即可

WPF程序运行测试

WPF前端XAML代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<Window x:Class="MatlabTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MatlabTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <StackPanel Orientation="Vertical">
            <RichTextBox x:Name="textBox" Height="300" Margin="10"/>
            <Button x:Name="myButton" Click="myButton_Click" Height="30" Width="100" Content="测试"/>
        </StackPanel>
    </Grid>
</Window>

后端功能逻辑C#代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using System.Windows;

using MathWorks;
using MathWorks.MATLAB;
using MathWorks.MATLAB.NET;
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
using C01_Leg_IK_201207_Compile_Test;

namespace MatlabTest
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        C01_Leg_IK_201207_Compile_Test.Class1 matdll = 
            new C01_Leg_IK_201207_Compile_Test.Class1();

        private void myButton_Click(object sender, RoutedEventArgs e)
        {
            MWArray a = 50, b = 100, c = "F";

            MWArray[] input = new MWArray[] { a, b, c };
            MWArray[] output = new MWArray[1];

            matdll.C01_Leg_IK_201207_Compile_Test(1, ref output, input);

            textBox.AppendText("计算得Motor2的角度为 " + output[0].ToString() + "\n");
        }
    }
}

成功运行后效果如图:

结论

WPF成功调用MATLAB编译生成的DLL。不过在未安装MCR的电脑上运行程序会没有响应,故想运行调用了MATLAB生成的DLL的WPF应用程序,则必须现在电脑上安装MCR,这对用户来说体验不好。故建议还是使用C编译生成的DLL来做进一步测试。