COM 経由で Byte() 配列に変換された 16MB のビットマップをグラフィック エンジンに渡しています。エンジンは 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 です。
事前に情報をありがとう。
ダニエル