小编Den*_*unn的帖子

在linux上从dotnet core调用matlab共享库

我正在尝试调用使用在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,必须在后台运行一些编组魔法.

  1. DLLImport语句的方法签名是否正确?我将mxArray**映射到IntPtr吗?
  2. 我如何从IntPtr获得双倍?将一块内存复制到托管字节数组并进行转换?

我的最终目标是从dotnet访问matlab代码的大型信号处理库.matlab代码使用了很多向量和数组,因此将这些进出非文件库是我的下一个障碍.

最好的祝福.

linux matlab-compiler .net-core

10
推荐指数
1
解决办法
513
查看次数

标签 统计

.net-core ×1

linux ×1

matlab-compiler ×1