Как передать данные из с++ dll в Unity c#. DllNotFoundException

Имеется задача:

Есть Intel RealSenseCamera, логика которой реализована в c++ dll.

Файл RealSenseCamera.h

#pragma once

#include <librealsense2/rsutil.h>
#include <libloaderapi.h>
#include <librealsense2/rs.hpp>

#include <opencv2/core/core.hpp>

#include <vector>

#ifdef VIDEODLL_EXPORTS
#define REALSENSECAMERA_API __declspec(dllexport)
#else 
#define REALSENSECAMERA_API __declspec(dllimport)
#endif


REALSENSECAMERA_API void __cdecl StartVideoRecording(uchar** itemFound, int* itemCount);

class REALSENSECAMERA_API RealSenseCamera
{
public:
    rs2::frame run();
    cv::Mat realsenseFrameToCvMat(const rs2::frame& f);

private:


rs2::pipeline m_pipe;
rs2::spatial_filter m_spatFilter;
rs2::temporal_filter m_tempFilter;
rs2::frameset m_processed;
};

и RealSenseCamera.cpp

#include "pch.h"
#include "RealSenseCamera.h"
#include <objidl.h>

void StartVideoRecording(uchar** data, int* len)
{
RealSenseCamera rs;
rs2::frame frame;
cv::Mat rgb;
frame = rs.run();

rgb = rs.realsenseFrameToCvMat(frame);
int size = rgb.cols * rgb.rows * rgb.channels();

std::vector<uchar> byteArray;

if (rgb.isContinuous())
{
    byteArray.assign(rgb.datastart, rgb.dataend);
}
else {
    for (int i = 0; i < rgb.rows; ++i)
        byteArray.insert(byteArray.end(), rgb.ptr<char>(i), rgb.ptr<char>(i) + rgb.cols);
}

*len = byteArray.size();
auto size = (*len) * sizeof(uchar);

*data = static_cast<uchar*>(CoTaskMemAlloc(size));
memcpy(*data, byteArray.data(), size);
}

rs2::frame RealSenseCamera::run()
{
static rs2::align align_to(RS2_STREAM_COLOR);

rs2::frameset frames = m_pipe.wait_for_frames();
rs2::depth_frame depth0 = frames.get_depth_frame();

auto framesf = frames;
framesf = m_spatFilter.process(framesf);
framesf = m_tempFilter.process(framesf);

m_processed = align_to.process(framesf);
rs2::depth_frame depth = m_processed.get_depth_frame();
rs2::frame  rgb = m_processed.get_color_frame();

return rgb;
}

cv::Mat RealSenseCamera::realsenseFrameToCvMat(const rs2::frame& f)
{
auto vf = f.as<rs2::video_frame>();
const int w = vf.get_width();
const int h = vf.get_height();
if (f.get_profile().format() == RS2_FORMAT_RGB8)
{
    cv::Mat ir(cv::Size(w, h), CV_8UC3, (void*)f.get_data());
    return ir;
}
else if (f.get_profile().format() == RS2_FORMAT_Z16)
{
    cv::Mat ir(cv::Size(w, h), CV_16UC1, (void*)f.get_data());
    return ir;
}
throw std::runtime_error("Frame format is not supported yet!");
}

Соответственно мне нужно передать данные о кадре в мой проект Unity. Для этого в функции StartVideoRecording в параметрах указана data, в которой планируется хранить все данные о кадре в виде массива байтов.

Я пытаюсь вызвать dll из Unity c#. Вот код

public class UseDll : MonoBehaviour
{
    [DllImport("VideoDll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl, EntryPoint = "StartVideoRecording@@YA_NPEA_JPEAPEAEPEAH@Z")]
    public static extern void StartVideoRecording(
        [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] out byte[] points,
        out int count);
    
    private byte[] points;
    private int len;


    void Start()
    {
        StartVideoRecording(out points, out len);
        foreach(var item in points)
        {
            Debug.Log("points: " + item);
        }
    }
}

Но получаю ошибку вида

DllNotFoundException: VideoDll

И ссылается на строчку из метода Start()

StartVideoRecording(out points, out len);

Я пробовал найти похожий кейс в интернете, но подобных задач я не встретил.

Буду рад любой помощи.

P.S.

Пробовал менять точку входа, а также обходиться без неё, результат тот же.


Ответы (0 шт):