首页 > 解决方案 > C# 初始化和销毁​​封送内存

问题描述

我有一个来自 C 库的函数,它根据结构的大小和 id 为结构分配内存,id 是在运行时使用注册器函数分配的。函数看起来像这样

void *allocate_objects(uint32_t structure_id, uint32_t size, uint32_t count, 
                       void *(*constructor)(void *), void (*destructor)(void *));

此外,它需要一个指向用于初始化分配的内存的构造函数的指针和一个在内存被释放后调用的析构函数(它可能不会被释放,但不再保留并且可以被库重用)。

该库不关心使用分配的内存中的实际内容allocate_objects,它只为它们管理内存。

我想从我的 C# 代码中将它与 C# 结构和类一起使用,但是我不知道如何正确地将构造函数和析构函数传递给分配函数。

我对如何完成有几个想法:

  1. 使用反射从工厂函数中获取类型的构造函数和析构函数,然后将其传递给 C 代码
  2. 让与库一起使用的类/结构实现一些成员函数(例如onCreateonDestroy),然后从工厂函数中调用

我是编组 C# 代码的菜鸟,所以我对这些想法有一些疑问:

  1. 是否有某种方法可以对已分配的内存使用反射?
  2. 如果我使用重载的虚拟函数,在未初始化的内存上调用它们是否安全(allocate_objects将执行等价的malloc并且内存不会被归零)
  3. 我与库一起使用的类型的约束是什么?我假设我不会被允许使用任何非原始类型,因为 GC 将无法到达 C 库使用的内存,或者当对象被 C 销毁时有办法强制 GC图书馆?

标签: c#cmarshalling

解决方案


推荐阅读