私のC#アプリケーションは、ラップされたC++コードを計算に使用します。
C ++ヘッダー:
__declspec(dllexport) void SetVolume(BYTE* data, unsigned int width);
C ++ / CLIラッパー:
void SetVolume(array<Byte>^ data, UInt32 width)
{
cli::pin_ptr<BYTE> pdata = &data[0];
pal->SetVolume(pdata, width);
}
C#:
public startCalc()
{
byte[] voxelArr = File.ReadAllBytes("Filtered.rec");
palw.SetVolume(voxelArr, 490);
//GC.KeepAlive(voxelArr); makes no sense
}
C ++SetVolume
関数は、非同期計算を開始します。voxelArr
管理側から参照されなくなり、ガベージコレクションされます。
voxelArr
アンマネージコードがグローバル変数として宣言せずに動作を終了するまで、この参照のガベージコレクションを防ぐにはどうすればよいですか?配列のコピーを作成することは、実際には大量のデータがあるため、オプションではありません。内部でのアクティブな待機startCalc()
も良くありません。