将委托定义为函数指针

2024-03-27

我正在使用调用非托管函数指针的委托。这会导致垃圾收集器在使用之前对其进行收集,如 MSDN 上的 CallbackOnCollectedDelegate MDA 页面中所述:CallbackOnCollectedDelegate MDA 的 MSDN 页面 http://msdn.microsoft.com/en-us/library/43yky316.aspx.

该决议指出我必须将适当的委托封送为非托管函数指针。我最初的反应是使用:

[MarshalAs(UnmanagedType.FunctionPtr)]
public delegate void EntityCallback([MarshalAs(UnmanagedType.SysInt)] IntPtr entity);

但是,C# 编译器不会让我封送委托,即使这是 MSDN 建议的解决方案。此外,MSDN页面仅显示了引发问题的示例,但没有提供解决方案。

如何将我的委托编组为非托管函数指针或防止其被 GC 处理?

EDIT:按照建议,我创建了回调的引用。因此,我的代码从/更改为:

// From:
foo.SetCallback(new EntityCallback(bar));

// To:
call = new EntityCallback(bar); // Referenced in class
foo.SetCallback(call);

现在这确实有效 - 但仅限于调试模式。当我切换到发布时,它在同一点崩溃。这是为什么?

EDIT 2:更完整的代码片段:

public class Test
{
    private EntityCallback Call;

    private void Bar(System.IntPtr target)
    {
        ...
    }

    public Entity Foo { get; set; }

    public Test()
    {
        this.Foo = new Body.Sphere() { Visible = false }; // Irrelevant
        this.Foo.CollisionType = 3; // Irrelevant

        this.Call = new EntityCallback(this.Bar);

        this.Foo.SetCallback(this.Call, EntityCallbackType.Collision);
    }
}

你没读对。你必须这样做:

...更改您的代码以保留参考 到托管方的代表 在编组者的一生中 非托管函数指针。

换句话说,只需在类中存储对委托实例的引用,并确保类对象存活足够长的时间。如果确实需要,请使用静电。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将委托定义为函数指针 的相关文章

随机推荐

  • 计算 Laravel 中的坐标距离

    我的模型中有一个创建别名的范围 我需要在其上执行一个 where 我知道 MySql 不允许这样做 标准 SQL 不允许您在 WHERE 中引用列别名 条款 施加此限制是因为当 WHERE 代码为 执行后 列值可能尚未确定 但是 我想知道
  • 创建数组并在一行中将其推入其中

    以下只是一个理论上的 JavaScript 问题 我很好奇以下内容是否可以转换为单个语句 if window foo window foo window foo push bar 这段代码大家可能都写过 但是一行能完成吗 起初我以为这样的事
  • uml 与 RDF 和 OWL 的组合关系

    我是 RDF 和 OWL 本体的初学者 我正在尝试将此图转换为 OWL 语法
  • 带有 Angular 2 和 webpack 2 的单个单独的 CSS 文件?

    我有一个使用 Angular 2 和 Webpack 2 的简单应用程序 使用 sass 作为模板和 angular2 template loader 这样我就可以使用templateUrl and styleUrls而不是使用requir
  • 更改监听输入源

    我想用 AutoHotkey 更改我的显示器输入源 并且我已经部分工作了 但是 当我使用热键将显示器输入源从 pc DVI 更改为我的 xbox YPbYr 时 显示器未检测到 xbox 已打开 它显示没有源 显示器 gt 华硕 VG236
  • 适用于移动应用程序的最佳远程技术是什么?

    我有一个 java 后端 需要向在以下环境中运行的客户端公开服务 J2ME 视窗手机 iPhone 我正在寻找适合每个平台的最佳工具 我不会寻找一种在任何地方都适用的技术 我需要一些适合低速互联网访问的 轻型 东西 现在我正在使用 SOAP
  • 列出所有可用的 .NET 程序集

    列出所有可用的 NET 2 0 程序集的最佳方法是什么 所需列表的一个示例是当您在 NET 选项卡中执行 添加引用 时 MS Visual Studio 显示的列表 我读过 Visual studio 使用它自己的目录配置 GAC 和 NE
  • 如何在 Jenkins 中处理 github webhook 负载?

    我目前正在通过 GitHub Webhook 触发我的 Jenkins 构建 我将如何解析 JSON 有效负载 如果我尝试参数化我的构建并使用 payload 变量 GitHub webhook 将失败并出现以下错误 h2 HTTP ERR
  • let 与 var 性能[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我一直在阅读有关 ES6 Let 关键字与现有 var 关键字的内容 我有几个问题 我知道 作用域 是 let 和 var 之间的唯一
  • 如何在 Firefox 中允许键盘焦点链接?

    在 Webkit 浏览器中转到这个超简单的小提琴 然后单击输入 http jsfiddle net eK4TT http jsfiddle net eK4TT
  • 警告:没有 xauth 数据;使用虚假身份验证数据进行 X11 转发

    在从 Fedora 23 到 Centos 7 进行 ssh 连接时 我遇到了一个不幸的问题 命令ssh X user centos7 and ssh Y user centos7两者都打印警告 没有 xauth 数据 使用伪造的身份验证数
  • django escapejs 和 simplejson

    我正在尝试使用 simplejson dumps 将 Python 数组编码为 json In 30 s1 test
  • 如何将PIL图像传递给python-pptx中的Add_Picture

    我正在尝试从剪贴板获取图像 并且想将该图像添加到 python pptx 中 我不想将图像保存在磁盘中 我已经尝试过这个 from pptx import Presentation from PIL import ImageGrab Ima
  • 使眼镜蛇命令标志成为必需

    我创建了一个 cobra 命令并添加了一个标志 cmd Flags StringVarP primaryIP primary ip p Help text 除了自己检查值并返回错误之外 还有其他方法可以使其成为必需吗 几个月前 这种行为发生
  • 类型错误:write() 参数必须是 str,而不是 _io.TextIOWrapper

    如何将一个文件复制到另一个文件 我使用的代码是 FileX open X txt r FileY open Y txt w X FileX FileY write FileX FileX close FileY close 这给出了错误 T
  • 数据库子类型/超级类型[重复]

    这个问题在这里已经有答案了 我有 农作物 玉米 大豆 和 谷物 表 Crop 中的一个条目对应于其他表之一中的单个条目 裁剪应仅与其他一张表一对一 但不得超过一张 Crop 表是必需的 因为它结合了其他表中的许多通用数据 并使代码端的信息查
  • 将双精度值转换为二进制值

    如何将双精度值转换为二进制值 我有一些像下面这样的值 125252525235558554452221545332224587265 我想将其转换为二进制格式 所以我将其保留为双精度 然后尝试转换为二进制 1 0 s 我正在使用 C net
  • 如何缓存或预加载SKLabelNode字体?

    我正在制作一个 Sprite Kit 应用程序 并在我的场景中添加了一个 SKLabelNode 当我加载 SKScene 时 我注意到有一个相当大的滞后峰值 在对应用程序进行分析后 我发现它来自于使用纸莎草字体创建 SKLabelNode
  • 如何使用 python 读取专辑封面? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在我的搜索中 我发现有一些库可以通过读取 ID3 标签来做到这一点 如果是这样 哪一个最好用 我不打算
  • 将委托定义为函数指针

    我正在使用调用非托管函数指针的委托 这会导致垃圾收集器在使用之前对其进行收集 如 MSDN 上的 CallbackOnCollectedDelegate MDA 页面中所述 CallbackOnCollectedDelegate MDA 的