1

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 です。

事前に情報をありがとう。
ダニエル

4

0 に答える 0