Как передать данные из с++ 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.
Пробовал менять точку входа, а также обходиться без неё, результат тот же.