簡體   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