Cで作られたDLLで公開されている 配列領域の先頭を指すポインタと配列サイズとを引数に取る関数
をC#から使いたい状況です.
「メモリ上で連続した領域を指すポインタを渡す必要があるため,
C#でデータ領域をIList<>等で表している場合には,
下記コードのように一旦ToArray()で配列にコピーする必要がある」
と考えていますが,
・そもそもこの考えは合っているでしょうか?
・可能であれば,このコピーを行わずに済ませたいのですが,何か方法はありませんでしょうか?
・配列以外で,メモリ上の配置が連続である型は存在しますか?
//DLLの関数
static class dll_func
{
[DllImport( DLLのファイル名 )]
unsafe extern void Func( byte *pByteArray, int ByteArraySize );
}
//DLL使う側
class XXX
{
void Work( IList<byte> data )
{
unsafe
{
byte[] ByteArray = data.ToArray(); //一旦配列にコピーする
fixed( byte *p = ByteArray )
{
dll_func.Func( p, ByteArray.Count() );
}
}
}
}