- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在将托管 System.Action 转换为 C++/CLI 项目中的非托管 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 时被卸载。
请注意,委托(delegate)对象不是这种情况,它受制于正常的垃圾收集规则。而且你必须要小心,这个 thunk 不会让它保持活力。这是您代码中的错误,可以在 native 代码忙于执行时收集委托(delegate)。您需要将这行代码添加到方法的末尾:
GC::KeepAlive(callback);
假设只有在执行 Execute() 方法时才会进行回调。如果非托管代码将函数指针存储在该方法调用之外,那么您必须将委托(delegate)对象存储在某处以保持其有效。
关于c# - Marshal::GetFunctionPointerForDelegate:我应该发布它的结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16526263/
我想知道 Marshal.GetFunctionPointerForDelegate。也就是说,我想知道它如何将委托(delegate)转换为非静态函数的函数指针。 它是否动态生成以某种方式附加了实例
我正在将托管 System.Action 转换为 C++/CLI 项目中的非托管 std::function;我应该在使用回调后释放给定的 IntPtr 还是不需要? void MyClass::Ex
我正在使用 Marshal.GetDelegateForFunctionPointer() 从 C# 调用 native x64 代码。我将一个指针作为参数传递到 native 代码中。我从 Mars
这是导致 MarshalDirectiveException 的代码示例。很好的解释SafeHandle可以找到 s here . [SuppressUnmanagedCodeSecurity] pr
我正在尝试使用具有回调机制的 (C) 第三方库,该机制缺少任何可能的识别调用上下文的方法。我的主要项目在 C# 中,我的包装器是一个调用 C 库 API 的 C++/CLI 项目。 为了解决这个问题,
我正在使用带有 .NET Framework 3.5 的 Visual Studio 2008 并制作一个 C++/CLI/.NET Forms 应用程序;游戏编辑器。除了编辑器之外的所有游戏代码都是
如上所述,在尝试将委托(delegate)作为回调传递给 native DLL 时,我需要知道这两种可能性之间的区别。我有时必须使用第一个,有时必须使用第二个才能使我的代码正常工作。但是,我不清楚有什
我正在尝试使用托管 C++ 将 C# 委托(delegate)转换为 C++ 函数指针。这是我们之前使用的方法: // Define a delegate public delegate void A
尝试使用 GetFunctionPointerForDelegate 通过互操作传递函数指针,(C# -> C++)。但是,我收到异常:指定的类型不能是泛型类型定义。 据我所知,我没有传递通用类型定义
我正在使用 Marshal.GetFunctionPointerForDelegate获取指向 native 函数的函数指针。然后,我通过常规 DllImport 机制将此函数指针传递给一些非托管代码
我曾经像这样从 C# 注册一个委托(delegate)到回调函数指针(不使用 Marshal.GetFunctionPointerForDelegate): C++(测试.dll) typedef v
我是一名优秀的程序员,十分优秀!