1
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 是托管的,我不能对它做指针和符号的东西。我有麻烦了吗?或者有没有办法摆脱我的困境?H5 函数是对 HDF5 库的调用。谢谢,萨罗杰

4

1 回答 1

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();
于 2013-02-16T04:59:22.707 回答