2009-11-10 2 views
1

나는 다음과 같은 방법을 수출 관리되지 않는 C++ DLL을 DLL 관리 보내기 C# 관리 코드에서 이러한 메서드를 호출하는 최상의 성능 방법이 될까요?는 바이트 [] [] C inbetween ++ 관리되지 않는 DLL 및 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); 
+1

은 inp와 outp가 겹치는 것과 같은 배열을 가리킬 수 있습니까? –

+0

옵션이 될 수 있습니다. – rkatiyar

답변

2

는 C++/CLI 옵션인가? IMO, 이런 종류의 복잡한 interop/custom 마샬링 시나리오가 설계되었습니다.

+0

C++/CLI에서 성능 단점에 대해 얼마나 많은 이야기를하고 있는지 알려드립니다. 지우기 인코딩 및 디코딩을위한 빠른 구현이 필요합니다. 그래서 C++을 선택하지 않는 것이 좋습니다. – rkatiyar

+0

죄송합니다, 의미 : 네이티브/관리 간의 interop에 대한 C + +/CLI를 사용하십시오. 단점은 3 개의 코드베이스 (1 개의 기본 C++, 1 개의 C++/CLI, 1 개의 C#)로 끝납니다. – Brannon

+0

물론 네이티브 C++ 라이브러리를 소유하고 있다면 P/Invoke를보다 잘 지원할 수 있도록 인터페이스를 조정할 수 있습니다. 그렇다면 시나리오를 좀 더 자세하게 설명하여 P/Invoke 친화적 인 추천을 제공 할 수 있습니다. – Brannon

-2

이러한 기능을 위해 COM 래퍼를 만드는 것이 좋습니다.

+0

나는 그것이 그가하려는 것을 믿습니다. 문제는 char **를 C#으로 마샬링하는 것입니다. – ParmesanCodice

+0

그는 char **를 별도의 인터페이스로 표현할 수 있으며 데이터 액세스에 편리한 방법을 제공합니다. – Alex

+0

C#이 아닌 C++에서 COM 래퍼를 만들려고합니다. 그리고 C# – Alex

1

당신이 관리하고 네이티브 힙 사이의 데이터를 마샬링해야합니까 :

나는 오직 이런 종류의 물건을 다루는 일 개 좋은 기사를 통해 왔어요? 버퍼의 모든 작업을 기본 DLL로 이동하면 힙간에 데이터 복사 비용을 피할 수 있습니다.

즉, 네이티브 힙에 데이터를 할당하고 Ref IntPtr 매개 변수로 반환 한 다음 버퍼의 주소를 IntPtr (void *와 동일합니다.)로 유지하고 전달해야합니다. 버퍼로 작업을 마친 후에는 네이티브 dll에서 다른 함수를 호출하여 버퍼를 삭제할 수 있습니다. 관리되는 힙으로 데이터를 복사해야 할 때 System.Runtime.InteropServices.Marshal.Copy를 사용하십시오 (CLR 마샬 러가 기본 제공 형식 마샬링을 위해 호출 한 것입니다).

버퍼 작동 함수의 COM 래퍼를 작성하면 속도가 약간 느려지지만 코드를보다 쉽게 ​​읽을 수 있습니다. 그러나 관리 코드가 COM 힙을 잠글 수 있기 때문에 COM 힙에 할당하는 속도가 약간 느려질 수 있습니다.

+0

당신의 의견에 감사드립니다. 나는 분명히 당신의 제안을 시도 할 것입니다. 나는 .NET과 C#에서 매우 익숙하다. IntPtr이 void *와 같은지는 몰랐습니다.나는 그들이 단지 int 참조를 보유 할 것이라고 생각 : ( – rkatiyar

관련 문제