我有以下代码将托管转换为非托管,反之亦然,
template<typename M, typename N>
class MNConv
{
public:
/// Native to Managed
static M N2M(N* pNative){
return safe_cast<M>(Marshal::PtrToStructure(IntPtr(pNative), M::typeid));
};
// Managed to Native
static void M2N(M managed, N* pNative){
Marshal::StructureToPtr(managed, IntPtr(pNative), true);
};
};
我是否需要致电AllocHGlobal
?如果我这样做,我应该怎么称呼它?
答案 0 :(得分:0)
根据MSDN,您应该在调用StructureToPtr
之前分配非托管内存块。我知道你应该在更高的范围内对本地指针执行Marshal::AllocHGlobal
,你也可以在Marshal::FreeHGlobal
之后执行。
仔细阅读ptr parameter description。
使用AllocHGlobal
也很简单 - 传递包含要分配的字节数的Int32
或IntPtr
对象。
另请注意,您应分别在M^
和M
中接收并返回M2N
(N2M
的处理程序/托管引用)。