内存泄漏将Byte()数组传递给非托管COM DLL

时间:2013-07-12 10:00:50

标签: vb.net com-interop unmanaged

我通过COM将大量16MB位图转换为Byte()数组到图形引擎。该引擎采用ByRef System.Array作为参数。

使用CLR Profiler,我可以看到Byte()数组永远不会获得GCd,这是有道理的,因为GC无法知道何时使用数组完成非托管DLL(紧接在调用之后)。

这是我创建数组的方式:

Public Function GetByteArray(ByVal BMP_ToByteArray As Bitmaps) As Byte()
    Load(BMP_ToByteArray)
    Dim Stream As System.IO.MemoryStream = New System.IO.MemoryStream()
    _Bitmaps(BMP_ToByteArray).Save(Stream, System.Drawing.Imaging.ImageFormat.Bmp)
    Stream.Close()
    GetByteArray = Stream.ToArray
    Unload(BMP_ToByteArray)
    Stream.Dispose()
End Function

然后我就像这样调用DLL:

byteArray = myBitmaps.GetByteArray(theBitmaps.Bitmaps.LevelUITarget)
Textures.TX_Score = Engine.DBTexture.LoadFromFileInMemory(byteArray, 2048, 2048)
byteArray = Nothing

byteArray永远不会被释放,并且在某些时候我的内存耗尽。我已经尝试过查看代码示例以了解如何解决这个问题,但是大多数处理的对象只需要一个指向字节数组的指针,而我确实需要传递一个system.array,而不是一个指针。

这完全在VB.NET 2010中,非托管DLL是一个VB6 DLL。

提前感谢任何信息。
丹尼尔

0 个答案:

没有答案