Я пытаюсь вызвать разделяемую библиотеку, созданную с помощью MathWorks MATLAB Compiler SDK из C # (.NET Core), работающей в контейнере Linux.
У меня есть файл matlab .m, который я скомпилировал в.dll с помощью компилятора MATLAB R2018b SDK.Поскольку конечной средой исполнения является .NET Core 2.2, работающая в контейнере Linux, я выбрал опцию «C Shared Library».Я называю эту общую библиотеку, используя механизм DLLImport .NET.
Вот код из моего проекта.Этот код на уровне KISS, потому что мне нужно понять, как интегрировать MATLAB и C # в Linux, прежде чем я начну с основного проекта.
haveSomePi.m
function hal = haveSomePi()
hal = 3.1415;
end
MyMath.h
extern LIB_MyMath_C_API bool MW_CALL_CONV mlfHaveSomePi(int nargout, mxArray** hal);
MyMathWrapper.cs
[DllImport("MyMath.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void mlfHaveSomePi(int nargout, ref IntPtr hal);
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);
}
Ожидаемый результат состоит в том, что утверждение в методе теста проходит.Это терпит неудачу, потому что попытка привести IntPtr к двойному не имеет смысла в этом контексте.Я уверен, что есть способ отменить ссылку на IntPtr, чтобы получить базовый дубль, я просто не нашел этот конкретный слепок информации.
Я добился успеха при компиляции файла .m вбиблиотека .NET и в COM-объект.Я не думаю, что смогу использовать ни одну из этих библиотек в Linux из-за различий в двоичном формате загрузки / ссылки для каждой ОС.При вызове метода в COM-объекте я смог напрямую привести IntPtr к двойному значению, в фоновом режиме должна происходить некоторая магия маршалинга.
- Правильна ли сигнатура метода для оператора DLLImport?Могу ли я сопоставить mxArray ** с IntPtr?
- Как получить двойное значение из IntPtr?Скопировать блок памяти в управляемый байтовый массив и привести?
Моя конечная цель - получить доступ к большой библиотеке обработки сигналов кода matlab из dotnet.В коде Matlab используется множество векторов и массивов, так что их перенос в неуправляемую библиотеку и из нее является моим следующим препятствием.
С наилучшими пожеланиями.