繁体   English   中英

在C ++非托管dll和C#托管dll之间发送Byte [] []

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM