托管结构被发送到非托管函数

时间:2013-02-16 04:34:15

标签: c++-cli

int atClass1::read_file
(String^ file_path, /* Path tofile */
 HdfCallVars % ret_vals)

这是我的功能。在其中我有很多本机c ++代码。我遇到了一个严重的问题

/* Iterate through the links, filling in needed data as discovered. */
  io_err = H5Literate (group_id, H5_INDEX_NAME, H5_ITER_NATIVE,

               &i, get_sonar_data, (void*)& ret_vals);

不会编译!说ret_vals是管理的,我不能做pointerey ampersandey东西。我有麻烦吗?还是有办法摆脱困境? H5功能是对HDF5库的调用。 谢谢, saroj

1 个答案:

答案 0 :(得分:0)

在.Net中,无法保证对象将保留在当前内存位置,因为垃圾收集器会在需要时“压缩”堆空间。

要获取指向托管对象的本机指针,您应该“固定”该对象:

pin_ptr<HdfCallVars> pinned = &ret_vals;
io_err = H5Literate (group_id, H5_INDEX_NAME, H5_ITER_NATIVE, 
                        &i, get_sonar_data, (void*)pinned);

请注意,在变量pinned超出范围后,指针将被取消固定,如果H5Literate存储指针以供将来使用,则应使用System :: Runtime :: InteropServices :: GCHandle固定值,如这样:

GCHandle ^handle = GCHandle::Alloc(ret_vals);
io_err = H5Literate (group_id, H5_INDEX_NAME, H5_ITER_NATIVE, 
                        &i, get_sonar_data, (void*)handle->AddrOfPinnedObject());

当你不再需要指针时,你应该释放它:

handle->Free();