我想拥有一个托管缓冲区作为混合类的成员:
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 下。