比方说,我有一个C#程序,需要在C ++中完成一些实现(例如,机器学习)。为此,我想要一个打开视频流,处理“事物”的DLL,然后我的C#程序可以抓取这些“事物”。
我发现了无数有关如何创建DLL以及如何调用DLL函数的示例,例如“ ShowImage()
”或“ GetImage(image_struct *theImage)
” ...在后者中,您可以在C#中分配内存并让C ++ DLL读入其中。
这里的DLL用某些东西填充了数据对象...在C#代码中创建了数据对象
C ++代码
extern "C" void __declspec(dllexport) __stdcall GetRawImageBytes(unsigned char* data, int width, int height)
{
unsigned char* final = someAwesomeDataGenerated();
std::memcpy(data, final.data, final.total() * final.elemSize());
}
C#代码
//Declarations
[DllImport("OpenCVDLL")]
private static extern void GetRawImageBytes(IntPtr data, int width, int height);
private GCHandle pixelHandle;
private IntPtr pixelPtr;
private Color32[] pixel32;
//later in some function...
pixel32 = tex.GetPixels32();
pixelHandle = GCHandle.Alloc(pixel32, GCHandleType.Pinned);
pixelPtr = pixelHandle.AddrOfPinnedObject();
GetRawImageBytes(pixelPtr, tex.width, tex.height);
这是我目前如何处理图像的示例。
现在,我解释一下哪个用例,但找不到真正的示例/说明:
我希望对象由DLL创建并保存,这意味着对象的生存期比仅我进行的单个函数调用长。
在纯C ++环境中,我将执行以下操作:
伪代码
main()
{
Dll.createSomeObject();
Dll.InitializeObject();
float valueFromDLL = Dll.GiveMeSomething();
Dll.DeleteObject();
}
但是如何使用C#对此建模?请注意,我主要关心的是此处Dll示例中“ SomeObject”的生存期。