将 CLR 类型转换为 void* 并返回

2024-04-01

例如,如何正确转换 CLR 类型Foo^, to void*过一段时间再回来?


场景是,我在 DLL 中有一些非托管代码,可以总结为

class Handler {
  void* _obj;
  void (*_call)(void* obj, int detail);

  void handle_event() { _call(_obj, 1234); }
public:
  void set_object(void* obj) { _obj = obj; }
  void set_callback(void(*callback)(void*,int)) { _call = callback; }
};

我想将 CLR 对象存储在Handler's _obj场地。考虑到GC可能会移动CLR对象,如何实现呢? (pin_ptr? gcroot?)

static void event_callback(void* obj, int detail) {
   Foo^ clr_obj = undo_magic(obj);
//                ^^^^^^^^^^ how?
   clr_obj->DoStuff(detail);
}

public ref class Foo {
   Handle* h;
public:
   void Start() {
     h = new Handler;
     void* obj = do_magic(this);
//               ^^^^^^^^ how?
     h->set_object(obj);
     h->set_callback(event_callback);
   }
   ...
}

需要固定。但是,您要存储此“引用”,要求该对象保持固定状态。这是非常不健康的,垃圾收集器必须不断地解决它。另一个问题是仅仅固定是不够的,必须有一个可识别的对象引用,这样 GC 就不会收集该对象。存储的 void* 还不够好。您通常可以使用 gcroot 解决此问题,但这在这里也不起作用。

更好的方法是简单地传递“句柄”。用一个Dictionary<int, Foo^>将 void* 转换回对象。或者一个List<Foo^>,现在索引可以是句柄。

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

将 CLR 类型转换为 void* 并返回 的相关文章

  • G1 GC 单个、非常长的年轻 GC 发生且 ParallelGCThreads=1

    I set ParallelGCThreads 1并使用G1 GC 所有其他JVM设置为默认设置 我跑PageRank在 Spark 1 5 1 上 有两个 EC2 节点 每个节点有 100 GB 堆 我的堆使用情况图如下 红色区域 年轻代
  • PInvoke 'class' 与通过引用传递 'struct'

    当我用谷歌搜索时 我看到帖子说传递 C class与通过相同struct通过引用 即ref SomeStruct name参数 到 C API 同时使用 PInvoke 这是一篇帖子C PInvoke 结构与类访问冲突 https stac
  • 如何估计调用 System.gc() 时剩余的内存量?

    我有一些使用以下配方的数据处理代码 读入内存中尽可能多的数据 称之为 块 对 chunk 进行处理 将处理后的块写入磁盘 Repeat 合并所有处理过的块以获得最终答案 当块尽可能少时 最后一个阶段的效率最高 因此我希望第一阶段读入内存中尽
  • 垃圾收集和 JNI 调用

    我遇到 JNI 程序随机内存不足的问题 这是一个 32 位 java 程序 它读取文件 进行一些图像处理 通常使用 250MB 到 1GB 然后 所有这些对象都会被丢弃 然后程序对 JNI 程序进行一系列调用 通常需要 100 250MB
  • C++ CLI DLL 不会被 IIS7 加载,但仅当使用比 VS2008 新的版本构建时才加载

    对于我的开发环境 我使用 Windows 7 Ultimate x64 VS2008 V2010 和 VS2013 我的应用程序是用 C 编写的 远程测试服务器具有 Windows Web Server 2008 R2 x64 和 IIS
  • 当文本框为空时,C++ Windows 窗体应用程序出现未处理的异常错误

    我正在 Visual Studio 中为 C 课程构建温度转换应用程序 它是一个 Windows 窗体应用程序 我的问题是 当我运行应用程序时 如果我没有在 txtFahrenheit 或 txtCelsius2 文本框中输入任何内容 我会
  • 相当于.net中的SoftReference?

    我熟悉WeakReference 但我正在寻找一个已清除的引用类型only当内存不足时 不仅仅是每次运行 gc 时 就像 Java 的SoftReference 我正在寻找一种实现内存敏感缓存的方法 ASP NET 缓存为您提供了所需的内存
  • C++/CLI:#pragma 托管/非托管范围

    我有一个混合模式 DLL 其中有一个包含托管和非托管代码的 cpp 文件 一个简化的重现示例如下所示 include stdafx h pragma managed Just for explicitness doesn t influen
  • 是否可以在不使用 WMI 的情况下获取网络适配器的 PnPDeviceId?

    我一直在尝试使用 p invoke setupapi 调用获取给定网络适配器的 PnPDeviceId 但没有成功 我不情愿地决定使用 WMI 如下所示 public static string GetPnpDeviceId string
  • C# 获取分配总数

    有没有办法获得分配总数 注意 分配数量 而不是分配的字节数 它可以是当前线程的 也可以是全局的 以更容易的为准 我想检查特定函数分配了多少个对象 虽然我了解 调试 gt 性能分析器 Alt F2 但我希望能够从程序内部以编程方式执行此操作
  • WinRT 有垃圾收集吗?

    WinRT 有垃圾收集吗 或者它是否像 COM 一样进行引用计数 I found 本文 http www itwriting com blog 4866 a few facts about microsofts new windows ru
  • python什么时候删除变量?

    我知道 python 有一个自动垃圾收集器 因此当不再引用变量时 它应该自动删除变量 我的印象是 局部变量 函数内部 不会发生这种情况 def funz z x f z x is a np array and contains a lot
  • JavaScript Blob 对象何时被垃圾回收?

    在现代浏览器中 可以将大对象分配为Blob 然后通过 URL 请求访问它 此 URL 将在浏览器的其他位置提供存储的对象 例如图像的数据 浏览器如何知道何时不再需要这个 URL 以及相应的Blob数据可以免费被垃圾收集吗 浏览器最终将清除该
  • ListView 与 getView() 由于不断的 GC 而变得缓慢?

    我的应用程序中有一个 ListView 并且我已经重写了 getView 方法 因此我可以根据行的文本更改行的 ImageView src 问题是 我注意到 ListView 滚动滞后 当我检查 DDMS 时 似乎每次滚动 ListView
  • 流畅的界面是否会显着影响 .NET 应用程序的运行时性能?

    我目前正忙于为现有技术实现一个流畅的接口 这将允许类似于以下代码片段的代码 using var directory Open Directory path to some directory using var file Open File
  • JDK 1.6.x G1 的经验(“垃圾优先”)

    我想知道最新JDK中G1垃圾收集器的体验如何 我懂了NullPointerException尽管代码没有改变并且在早期的 JDK 中表现正常 但我的程序中抛出了这个问题 垃圾收集器只会影响表现您的应用程序 而不是它的正确性 我一直在 Ecl
  • C# 中如何实现引用返回?

    既然 C GC 可以移动内存 那么如何实现引用返回呢 下面的代码会导致 未定义的行为 吗 public struct Record public int Hash public VeryLargeStruct Data public cla
  • 什么触发了java垃圾收集器

    我对 Java 中垃圾收集的工作原理有点困惑 我知道当不再有对某个对象的实时引用时 该对象就有资格进行垃圾回收 但是如果它有对实时对象的引用怎么办 可以说我有一个节点集合 它们再次引用更多节点 List 1 gt Node a gt Nod
  • C# 和 .Net 垃圾收集器性能

    我正在尝试用 C 和 NET 制作游戏 并且计划实现更新游戏世界中游戏对象的消息 这些消息将是 C 引用对象 我想要这种方法 因为如果我希望游戏是多人游戏 那么通过网络发送它们会更容易 但是如果我有很多消息 对于垃圾收集器来说不是压力很大吗
  • numpy.ndarray 对象不被垃圾回收

    在尝试微调某些 C C 函数的 Python 绑定中的一些内存泄漏时 我发现了一些与 Numpy 数组的垃圾收集相关的奇怪行为 为了更好地解释这种行为 我创建了几个简化的案例 该代码是使用memory profiler 其输出紧随其后 当涉

随机推荐

  • ROWID (oracle) - 有什么用吗?

    我的理解是 ROWID 是查询返回的结果中每一行的唯一值 为什么我们需要这个ROWID ORACLE中已经有ROWNUM了 有人在 SQL 查询中使用过 ROWID 吗 ROWID 是行的物理位置 因此 它是定位行的最快方法 甚至比主键查找
  • 在构建过程中将静态库链接到共享库?

    我在使用 GCC Linux 构建共享库时遇到问题 目前这个共享库是使用 GCC libtool 选项 shared 创建的 一切都很好 现在必须将两个额外的静态库 a 文件 添加到此共享库中 因为它们提供了共享库所需的一些功能 使用选项
  • 该通道未配置任何具有“发现”角色的对等方

    我正在尝试从 java Fabric SDK 进行事务处理 我能够从节点正确查询数据 但在执行事务时出现以下错误 org hyperledger fabric sdk exception ServiceDiscoveryException
  • 类型定义字符串中的元素数量与第 8 行 /home/a3598479/public_html/Register.php 中的绑定变量数量不匹配

    请帮我 我实际上并不使用 PHP 但我需要在我的登录 注册项目中使用 con mysqli connect name POST name username POST username password POST password state
  • iOS 启动图像不会显示在 iPhone 或模拟器上,但可在 iPad 上显示

    无论我使用资产目录还是传统方式 我都会遇到这个问题 所有情况下均使用 Xcode 5 1 1 我已经输入了所有图像 并且 Xcode 没有给出 您缺少 568 h 错误或任何其他信息 但是当我启动应用程序时 我的启动图像仅显示在 iPad
  • SQL Server 2005:可为空的外键约束

    我在表会话和用户之间有外键约束 具体来说 Sessions UID Users ID 有时 我希望 Sessions UID 为空 这可以被允许吗 每当我尝试这样做时 我都会遇到 FK 约束违规 具体来说 我通过 LINQ 将一行插入到 S
  • 单例模式与 Web 应用程序,不是一个好主意!

    我发现了一些有趣的东西 我在调试其他东西时幸运地注意到了它 我正在应用 MVP 模式 并制作了一个单例控制器以在所有演示文稿之间共享 突然我发现有些事件在第一次回发时被调用一次 如果有两次回发则调用两次 如果有100次回发则调用100次 因
  • JavaScript 错误:“不是构造函数”

    我使用backbone js以及jquery和underscore js 这是我的一些代码 它还没有做任何事情 奇怪的是 点击 url users 后没有错误 发生错误的唯一一次是当我单击转到不同的哈希 然后单击返回转到 users 时 这
  • 在Python中动态评估简单的布尔逻辑

    我有一些动态生成的布尔逻辑表达式 例如 A 或 B 和 C 或 D A 或 A 和 B A 空 计算结果为 True 占位符被替换为布尔值 我是不是该 将此信息转换为 Python 表达式 例如True or True or False a
  • 如何模拟dbcontext?

    我正在使用实体框架核心 1 0 rc2 这是班级 public class ApplicationDbContext DbContext public ApplicationDbContext DbContextOptions
  • 如何定义两个实体之间的多重关系?

    我有一个场景user可以上传多个photos 一对多 这user还可以有默认照片 一对一 然而 我实体框架core 2 0告诉我当我使用以下代码时他无法识别这种关系 public class User public Guid Id get
  • 如果在嵌套集合上使用 SelectMany,则保留父实例

    我有我的模型的集合Person class Person public string FirstName get set public string LastName get set public string Company get se
  • 搜索 .pst 文件时,FOR 在到达隐藏的快捷方式文件夹时不断循环

    以下命令创建一个无限循环 这不是我想要的 因为我正在迭代文件并且它需要在某个时候结束 这是我所拥有的 cd C FOR R i IN pst do echo i 看看会发生什么 当它到达 AppData 并找到 pst 在 AppData
  • 如何在 Flutter 中构建静态 datePicker 小部件,而不需要先按按钮

    我想用 Flutter 构建一个静态 DatePicker 而不需要之前按下按钮 当屏幕加载时 它应该显示选择器 尝试了 flutter cupertino date picker 尝试了 flutter datetime picker 1
  • 比较 D3.js 中的两个时间对象

    在 D3 js 中 我目前正在尝试根据数据数组是否包含该时间来填充一个空数组 数组仅包含每 5 分钟后的时间戳 如果数据数组包含时间 则应复制该值 否则为 null 但是当我尝试比较两个时间对象时它无法正常工作 以下是代码 当前代码不是复制
  • Android 在来电时关闭媒体服务

    我对 android 和 java 真的很陌生 我正在制作一个应用程序 它有一个媒体服务 我希望媒体在来电时停止或暂停 这是我的媒体服务代码 公共类 ServiceMusic 扩展服务 MediaPlayer music Override
  • “Mac 开发者”和“第三方 Mac 开发者应用程序”之间的区别

    有什么区别Mac Developer and 3rd Party Mac Developer Application配置文件在Code Signing Identity 哪一个适用于 Mac App Store 分发 我也为此摸不着头脑有一
  • CURLOPT_FOLLOWLOCATION 无法激活[重复]

    这个问题在这里已经有答案了 所以我在多个服务器上不断收到这个恼人的错误 它是一个警告 所以我会忽略它 但我需要该功能 警告 curl setopt function curl setopt 当启用 safe mode 或在第 56 行 ho
  • 为android中的应用程序制作小部件

    我已经在android中做了一个应用程序 现在我的要求是我想为此应用程序制作一个小部件 我已经做了一个Widget Demo 但我不知道如何通过小部件图标启动我的应用程序 请给我一个方法来做到这一点 任何帮助将不胜感激 主要类别 publi
  • 将 CLR 类型转换为 void* 并返回

    例如 如何正确转换 CLR 类型Foo to void 过一段时间再回来 场景是 我在 DLL 中有一些非托管代码 可以总结为 class Handler void obj void call void obj int detail voi