我有一个非托管的C++库.我想公开.NET应用程序的功能.有一个部分功能我不知道如何处理:
typedef void(free_fn*)(void*); void put(void*data,free_fn deallocation_function);
我们的想法是将动态分配的缓冲区传递给函数并提供释放函数.该库将异步处理数据,并在以后不再需要数据时释放缓冲区:
void*p = malloc(100); ...填写缓冲区... put(p,free);
我如何向.NET应用程序公开这种东西?
这样做时要非常小心..NET确实非常希望将其对象固定在非托管例程的路上并在出路时取消固定.如果您的非托管代码保留在指针值上,那时已经固定在那里,那么内存将被移动或垃圾收集或两者兼而有之.
对于功能指针编组的代理来说尤其如此(相信我 - 我发现编组代表正在垃圾收集我 - 我让微软的人验证了这一点).此问题的最终解决方案是将静态表中的代理副本存储在与唯一事务id配对的静态表中,然后创建一个非托管函数,在调用时通过事务ID查找表中的委托然后执行它.这很难看,如果我有另一种选择,我会用它.
在您的情况下,这是执行此操作的最佳方法 - 因为您的非托管代码使用了一个设置并忘记了它的模型,那么您应该使您的API更加厚实.在托管C++中创建一个包装器,通过非托管例程分配内存,将数据复制到其中,然后将其与指向非托管解除分配器的指针一起传递.