Я пытаюсь создать простую dll в C ++ и вызвать ее из C #, используя PInvoke. Я хочу передать байтовый массив, выполнить некоторые манипуляции с ним и отправить обратно другой байтовый массив. Я решил передать кадр и размер, а затем создать неуправляемый беззнаковый символ *. Я бы передал это обратно в IntPtr и вернул размер. Потом я освободил бы эту память другой функцией. Все работает хорошо, за исключением того, что я не могу заставить работать IntPtr. Я всегда просто получаю 0 обратно. Я создал свою C ++ DLL в QT. Вот код, который у меня есть.
#pragma once
#ifdef TOOLS_EXPORTS
#define TOOLS_API __declspec(dllexport)
#else
#define TOOLS_API __declspec(dllimport)
#endif
class Tools
{
public:
int TOOLS_API TestFunction(const unsigned char *inData, int inSize, unsigned char *outData);
};
#include "Tools.h"
int Tools::TestFunction(const unsigned char *inData, int inSize, unsigned char* outData)
{
outData = (unsigned char*)malloc(sizeof(unsigned char) * inSize);
memcpy(outData, inData, sizeof(unsigned char) * inSize);
return inSize;
}
[DllImport("Tools.dll", EntryPoint = "?TestFunction@Tools@@QAEHPBEHPAE@Z", CallingConvention = CallingConvention.StdCall)]
public static extern int TestFunction(byte[] inData, int inSize, out IntPtr outData);
IntPtr outData;
int test = TestFunction(data, data.Length, out outData);