管理されていないデータを管理された配列にコピーする 質問する

管理されていないデータを管理された配列にコピーする 質問する

C++/CLI (配列) を使用して、ネイティブ (つまり、管理されていない) データ (byte*) を管理されたバイト配列にコピーする必要があります。

Marshal::Copy を試しました (データは const void* data によってポイントされ、dataSize バイトです)

array<byte>^ _Data=gcnew array<byte>(dataSize);
System::Runtime::InteropServices::Marshal::Copy((byte*)data, _Data, 0, dataSize);

これはエラーC2665を引き起こします: 16のオーバーロードのどれもすべてのパラメータを変換できません。そこで私は試しました

System::Runtime::InteropServices::Marshal::Copy(new IntPtr(data), _Data, 0, dataSize);

これにより、エラー C2664 が発生します: パラメーター 1 は "const void*" から "__w64 int" に変換できません。

それで、それはどのように実行できるのでしょうか。そして、Marshal::Copy は実際に「最良」(最も簡単/最速) の方法なのでしょうか。

ベストアンサー1

ご指摘のとおり、Marshal::Copy(.NET 全般) はconst-safe ではありません。

ただし、通常の C および C++ 関数は、次のいずれかの方法で記述できます。

array<byte>^ data_array =gcnew array<byte>(dataSize);
pin_ptr<byte> data_array_start = &data_array[0];
memcpy(data_array_start, data, dataSize);

またはピン留めを回避するには:

array<byte>^ data_array =gcnew array<byte>(dataSize);
for( int i = 0; i < data_array->Length; ++i )
    data_array[i] = data[i];

おすすめ記事