0

我有一个从本机 DLL 获取的位图图像的 char* 缓冲区。

我正在使用 C++/CLI 将本机 DLL 导出到 .Net

我想在没有额外副本的情况下创建一个 Drawing.Bitmap 对象形式的缓冲区。
这可以通过其中一个构造函数来完成。

问题是管理内存,当 GC 收集图像时如何删除缓冲区?

我想扩展位图,保留指向缓冲区的指针,并覆盖析构函数。

但是,如您所知,位图是密封的,图像不能被继承....有
什么想法吗?

4

1 回答 1

3

恭喜,您遇到了一个很好的例子,说明为什么强烈建议 DLL 填充调用者提供的缓冲区,而不是返回指向在 DLL 中分配的内存的指针。通过使用调用者提供的缓冲区,您允许调用者使用他喜欢的任何方法来管理其生命周期。C++ 调用者可以使用智能指针。.NET 调用者可以使用垃圾收集。与图像关联的缓冲区可以归位图实例所有。

在您的情况下,最好的解决方案是创建适当大小和像素格式的位图,调用LockBits以访问其内部缓冲区,并将指向该缓冲区的指针传递给 DLL,然后 DLL 可以将其输出直接放入位图中。最后,调用UnlockBits.

于 2013-06-22T16:40:41.993 回答