Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#封送内存的初始化和销毁_C#_C_Marshalling - Fatal编程技术网

C#封送内存的初始化和销毁

C#封送内存的初始化和销毁,c#,c,marshalling,C#,C,Marshalling,我有一个C库函数,它根据结构的大小和id为结构分配内存,id在运行时使用注册器函数分配。函数如下所示 void *allocate_objects(uint32_t structure_id, uint32_t size, uint32_t count, void *(*constructor)(void *), void (*destructor)(void *)); 此外,它还获取一个指向用于初始化已分配内存的构造函数的指针和一个析构函数,该

我有一个C库函数,它根据结构的大小和id为结构分配内存,id在运行时使用注册器函数分配。函数如下所示

void *allocate_objects(uint32_t structure_id, uint32_t size, uint32_t count, 
                       void *(*constructor)(void *), void (*destructor)(void *));
此外,它还获取一个指向用于初始化已分配内存的构造函数的指针和一个析构函数,该析构函数在释放内存后被调用(它可能不会被释放,但不再保留,并且可以被库重用)

库不关心使用
allocate\u objects
分配的内存中的实际内容,它只管理这些对象的内存

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

关于如何做到这一点,我有几个想法:

  • 使用反射从工厂函数中获取类型的构造函数和析构函数,然后将这些构造函数和析构函数传递给C代码
  • 让库中使用的类/结构实现一些成员函数(例如,
    onCreate
    onDestroy
    ),然后从工厂函数调用这些函数
  • 我是编组C#代码的noob,因此我对这些想法有一些疑问:

  • 是否有某种方法可以在已分配内存的情况下使用反射
  • 如果我使用重载虚拟函数,在未初始化的内存上调用它们是否安全(
    allocate\u objects
    将执行与
    malloc
    等价的操作,并且内存不会为零)
  • 我在库中使用的类型的约束是什么?我假设不允许使用任何非原语类型,因为GC将无法访问C库使用的内存,或者有没有办法在对象被C库销毁时强制GC

  • @HansPassant该程序本身并不完全是C#,它在某些代码部分使用C#来简化脚本编写,但是大多数面向性能的代码都是用C编写的。C代码的其他部分也使用此函数,而将指向C#分配对象的指针传递到库中则意义不大,需要更多的工作,因为C代码的其余部分希望使用此函数分配和管理内存