[英]Sending Byte[][] inbetween C++ unmanaged dll and C# managed dll
我有一个非托管的C ++ dll,可导出以下方法:
ERASURE_API void encode(unsigned char ** inp, unsigned char ** outp,
unsigned int *block_nums, size_t num_block_nums, size_t sz);
ERASURE_API void decode(unsigned char ** inp, unsigned char ** outp,
unsigned int * index, size_t sz);
inp和outp的大小可以高达10KB,从C#托管代码调用这些方法的最佳性能方法是什么?
编辑:我做了以下实现,并且有效,但这是最有效的方法。
C ++:
ERASURE_API void encode_w(unsigned char * inpbuf,int k, unsigned char * outpbuf,
int nfecs, unsigned int * block_nums, size_t num_block_nums, size_t sz)
{
unsigned char ** inp= new unsigned char*[k];
for(i=0;i<k;i++){
inp[i] = inpbuf+i*sz;
}
unsigned char ** outp= new unsigned char *[nfecs];
for(i=0;i<nfecs;i++){
outp[i] =outpbuf+i*sz;
}
encode(inp,outp,block_nums,num_block_nums,sz);
delete [] inp;
delete [] outp;
}
C#:
[DllImport("erasure.dll")]
public static extern void encode_w([In] byte[] inpbuf,int k,[Out] byte[] outpbuf,
int nfecs, uint[] block_nums, int num_block_nums, int sz);
是否可以选择C ++ / CLI? IMO,它是为这类复杂的互操作/自定义封送处理方案而设计的。
Errg那是在那儿要做的很棒的编组。
我只见过一篇很好的文章,涉及这种事情:
在C#中从非托管代码整理可变长度数组
您是否需要在托管堆和本机堆之间封送数据? 如果将缓冲区上的所有操作移至本机DLL,则可以避免在堆之间进行数据复制的开销。
这意味着您需要在本机堆上分配数据,将其返回给ref IntPtr参数,然后将缓冲区的地址保存在IntPtr(等效于void *的.Net)中并将其传递。 使用完缓冲区后,可以在本机dll中调用另一个函数以删除缓冲区。 当您必须将数据复制到托管堆时,请使用System.Runtime.InteropServices.Marshal.Copy(这是CLR编组器要求编组内置类型的内容)。
创建缓冲区操作函数的COM包装器会稍慢一些,但会使代码更具可读性。 但是,在COM堆上进行分配可能会稍慢一些,因为托管代码也可以锁定COM堆。
我建议为这些功能创建COM包装器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.