- How to compile a Matlab function into a DLL
- Use the generated Matlab dll into a small C#-console program
Requirements:
- VisualStudio 2015 or greater
- Matlab 2018b
Creating the .Net Matlab DLL
Create a matlab-file: MatlabThreeFunc.m
With the following content:
function [x2, sinx, expx]=MatlabThreeFunc(xIn)
% [x2, sinx, expx]=MatlabThreeFunc(xIn)
% Matlab test function
x2=xIn.*xIn;
sinx = sin(xIn);
expx = exp(xIn);
end
As you see this simple function calculate the squared-, sin- and the exp- values of the input array xIn.
Navigate to the folder containing the file/function just created and execute the fololwing command:
mcc -W 'dotnet:MyMatlab.V2018b,WrapperClass,4.5,Private,local' -T link:lib ./MatlabThreeFunc.m;
This will create a .Net dll, named V2018b.dll (version 4.5 of the Framework), containing a Class named WrapperClass and located in the namespace: MyMatlab.V2018b
In my My personal convention is to use part of the namespace (V2018b) to indicate which Matlab version I used to generate the dll. This is important when distributing your application.
In my case, I want to run the application on other Computer I need to install the required Matlab Runtime 9.5 (=> https://www.mathworks.com/products/compiler/matlab-runtime.html)
Using the DLL in a C# project
Create a new Console Application:
Before you add a reference to the Just created DLL (=> V2018b.dll) it is important that you remove the VisualStudio default setting Prefer 32 Bit, otherwise you'll get a Runtime Type Exception from the Matlab dll. (=> Since Version 2015b, Matlab is ONLY 64 bit!)
Remove"Prefer 32Bit"
Add the TWO Matlab-References to your project:
- V2018b.dll
- MWArray.dll (this is located under : C:\Program Files\MATLAB\R2018b\toolbox\dotnetbuilder\bin\win64\v4.0\MWArray.dll)
And now the code:
CODE:
using System;
using MathWorks.MATLAB.NET.Arrays;
namespace MatlabFuncInCSharp
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Running...");
// a basic double-array for the tests
double[] dArrayInput = new double[5] { 0.1, 0.2, 0.3, 0.4, 0.5 };
// convert the C#-array into the equivalent MatLab class
MWNumericArray matArrayInput = new MWNumericArray(dArrayInput);
Console.WriteLine("Instantiating WrapperClass...");
MyMatlab.V2018b.WrapperClass oWrapperClass = new MyMatlab.V2018b.WrapperClass();
int iExpectedNumberOfOutputs = 3; // we want ALL 3 outputs of "MatlabThreeFunc"
Console.WriteLine("Callinng MatlabThreeFunc...");
MWArray[] matOutput = oWrapperClass.MatlabThreeFunc(iExpectedNumberOfOutputs, matArrayInput);
// matOutput contains 3 elements
MWNumericArray matX2Array = (MWNumericArray)matOutput[0]; // casting required!
MWNumericArray matSinXArray = (MWNumericArray)matOutput[1]; // casting required!
MWNumericArray matExpXrray = (MWNumericArray)matOutput[2]; // casting required!
Console.WriteLine("Converting output into C#-Arrays...");
// back to the C#-world...
double[] dX2array = (double[])matX2Array.ToVector(MWArrayComponent.Real);
double[] dSinXarray = (double[])matSinXArray.ToVector(MWArrayComponent.Real);
double[] dExpXarray = (double[])matExpXrray.ToVector(MWArrayComponent.Real);
Console.WriteLine("Press any key to exit!");
Console.ReadKey();
}
}
}
I hope you found this post useful. A small video would have been wayyyyyyyyyyy better but I don't have the time for it.
References:
- Mathworks: https://www.mathworks.com/help/compiler_sdk/ml_code/mcc.html#butg_5w
- Mathworks' samples: C:\Program Files\MATLAB\R2018b\toolbox\dotnetbuilder\Examples\VS15\NET