我有一个位图图像的char *缓冲区,我从本机DLL中获取。
我正在使用C ++ / CLI将本机DLL导出到.Net
我想创建一个没有额外副本的缓冲区的Drawing.Bitmap对象表单 这可以使用其中一个构造函数完成。
问题在于管理内存,如何在GC收集图像时删除缓冲区?
我想扩展Bitmap,保留指向缓冲区的指针,并覆盖析构函数。
但是,如你所知,Bitmap是密封的,Image不能继承.... 有什么想法吗?
答案 0 :(得分:3)
恭喜,您已经遇到了一个主要的例子,为什么强烈建议DLL填充调用者提供的缓冲区,而不是返回指向DLL中分配的内存的指针。通过使用调用者提供的缓冲区,您可以允许调用者使用他喜欢的任何方法来管理其生命周期。 C ++调用者可以使用智能指针。 .NET调用者可以使用垃圾回收。与图像相关联的缓冲区可以由Bitmap实例拥有。
在您的情况下,最好的解决方案是创建适当大小和像素格式的位图,调用LockBits
以访问其内部缓冲区,并将指向该缓冲区的指针传递给DLL,然后可以将其输出直接放入位图。最后,致电UnlockBits
。