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)时 - 我该怎么做?我可以只固定内部 m_bytes 成员而不固定外部 ByteArray 对象吗?

解决方案:使用 gcroot 代替 auto_gcroot。托管字节数组将被 GC 清理,不必在 auto_gcroot 下。

4

0 回答 0