我正在尝试调用使用在Linux容器上运行的C#(.NET Core)的MathWorks MATLAB Compiler SDK创建的共享库.
我有一个matlab .m文件,我使用MATLAB R2018b编译器SDK编译成.dll.因为最终执行环境是在Linux容器上运行的.NET Core 2.2,所以我选择了"C共享库"选项.我使用.NET的DLLImport机制调用该共享库.
这是我项目中的一些代码.这段代码是KISS级的,因为在开始主项目之前,我需要了解如何在Linux上集成MATLAB和C#.
haveSomePi.m
function hal = haveSomePi()
hal = 3.1415;
end
Run Code Online (Sandbox Code Playgroud)
MyMath.h
extern LIB_MyMath_C_API bool MW_CALL_CONV mlfHaveSomePi(int nargout, mxArray** hal);
Run Code Online (Sandbox Code Playgroud)
MyMathWrapper.cs
[DllImport("MyMath.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void mlfHaveSomePi(int nargout, ref IntPtr hal);
Run Code Online (Sandbox Code Playgroud)
MyMathWrapperTests.cs
[TestMethod]
public void ShouldReturnPi()
{
var hal = IntPtr.Zero;
MyMathWrapper.mlfHaveSomePi(1, ref hal);
double result = (double)hal;
Assert.AreEqual(3.1415, result, 1e-5);
}
Run Code Online (Sandbox Code Playgroud)
预期的结果是测试方法中的断言通过.它失败是因为尝试将IntPtr强制转换为double在这种情况下没有意义.我确信有一种方法可以取消引用IntPtr以获得底层的双重,我只是没有找到特定的信息块.
将.m文件编译成.NET库和COM对象时,我成功了.我不认为我可以在Linux上使用这些库中的任何一个,因为每个操作系统的二进制加载/链接格式不同.在COM对象中调用方法时,我能够直接将IntPtr强制转换为double,必须在后台运行一些编组魔法.
我的最终目标是从dotnet访问matlab代码的大型信号处理库.matlab代码使用了很多向量和数组,因此将这些进出非文件库是我的下一个障碍.
最好的祝福.