加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Marshal :: GetFunctionPointerForDelegate:我应该发布它

发布时间:2020-12-15 18:00:54 所属栏目:百科 来源:网络整理
导读:我正在将一个受管理的System.Action转换为一个C/C++LI项目中的非托管std :: function;我应该在使用回调后释放给定的IntPtr,还是不必要? void MyClass::Execute(System::Action^ callback){ IntPtr callbackPtr = Marshal::GetFunctionPointerForDelegate(ca
我正在将一个受管理的System.Action转换为一个C/C++LI项目中的非托管std :: function;我应该在使用回调后释放给定的IntPtr,还是不必要?
void MyClass::Execute(System::Action^ callback)
{           

    IntPtr callbackPtr = Marshal::GetFunctionPointerForDelegate(callback);
    std::function<void (void)> nativeCallback = static_cast<void (__stdcall *) (void)>(callbackPtr.ToPointer());

    m_nativeObject->Execute(wrappedCallback);

    // should I release callbackPtr here?
}

解决方法

没有.没有Marshal类方法可以做到这一点.与所有动态生成的代码一样,此方法创建的thunk与AppDomain关联,并在卸载AppDomain时卸载.

请注意,委托对象不是这种情况,它受普通垃圾收集规则的约束.而且你必须要小心,thunk不能让它保持活力.这是代码中的错误,可以在本机代码忙于执行时收集委托.您需要将这行代码添加到方法的末尾:

GC::KeepAlive(callback);

假设只有Execute()方法执行时才会进行回调.如果非托管代码将函数指针存储在此方法调用之外,则必须将委托对象存储在某处以使其保持有效.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读