混合クラスのメンバーとしてマネージ バッファーが必要です。
class A {
cli::array<Byte> m_managedBuffer;
}
これにより、次の結果が得られます。
エラー C3265: アンマネージド 'A' でマネージド 'm_managedBuffer' を宣言できません
だから私は auto_gcroot を使ってみました:
class A {
auto_gcroot<cli::array<Byte> ^> m_managedBuffer;
}
そして、次のエラーが発生しました:
エラー C2106: '=': 左オペランドは左辺値でなければなりません
私の解決策は、管理されたラッパーを使用することです
ref class ByteArray
{
public:
ByteArray(size_t size) {
m_bytes = gcnew cli::array<Byte>(size);
}
cli::array<Byte> ^ m_bytes;
};
私はこれが好きではありません。これは、実際のバッファーに到達するための間接的なレベルを導入するためです。さらに、マネージ バッファー (pin_ptr) を固定したい場合 - どうすればよいですか? 外側の ByteArray オブジェクトを固定せずに、内側の m_bytes メンバーだけを固定できますか?
解決策: auto_gcroot の代わりに gcroot を使用します。管理されたバイト配列は GC によってクリーンアップされます。auto_gcroot の下にある必要はありません。