我通过 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。
在此先感谢您的任何信息。
丹尼尔