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
答案 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();