如何在C ++中正确创建要在C#中使用的DLL

时间:2018-11-22 08:51:11

标签: c# c++ dll dllimport dllexport

比方说,我有一个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”的生存期。

0 个答案:

没有答案