2

混合クラスのメンバーとしてマネージ バッファーが必要です。

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 の下にある必要はありません。

4

0 に答える 0