2016-07-01 73 views
0

我有LZ4 C實現的一個dll,我想打電話從C#代碼傳遞一個字符數組從C#到C++ DLL

LZ4_compress_default(const char* source,char* dest,int sourceLength,int maxdestLength); 

功能。該函數將源數組壓縮到dest數組中。這個怎麼做?

我的C#代碼:

DllImport(@"CXX.dll", CharSet = CharSet.Ansi, SetLastError = true, 
    CallingConvention = CallingConvention.Cdecl)] 
internal static extern int LZ4_compress_default(
    [MarshalAs(UnmanagedType.LPArray)] char[] source, out byte[] dest, 
    int sourceSize, int maxDestSize); 


byte[] result= new byte[maxSize]; 
int x = LZ4_compress_default(array, out result, size, maxSize); 
+0

應該是無符號字符*。這方面的哪一方面你不能做。 –

+0

有問題通過引用傳遞dest數組。壓縮數組是由dll.But寫的,但我沒有得到在c#端的變化。 –

+0

'[Out] byte [] dest',顯然你需要在調用函數 –

回答

1

你的代碼中有一些錯誤:

  • 是沒有意義的設置CharSet,因爲這裏沒有文字。
  • 你指定SetLastErrortrue但我懷疑你的C函數調用Win32的SetLastError函數。
  • 在C#中char是一個2字節的文本,其中包含一個UTF-16字符元素。不批量C charunsigned char這是8位類型。
  • 您的代碼需要C函數分配一個託管的byte[],因爲該字節數組聲明爲out參數。您的C代碼無法分配託管的byte[]。相反,你需要讓調用者分配數組。所以參數必須是[Out] byte[] dest

C代碼應該使用unsigned char而不是char,因爲您使用的是二進制而不是文本。它應該是:

int LZ4_compress_default(const unsigned char* source, unsigned char* dest, 
    int sourceLength, int maxDestLength); 

匹配C#的P/Invoke是:

[DllImport(@"...", CallingConvention = CallingConvention.Cdecl)] 
static extern int LZ4_compress_default(
    [In] byte[] source, 
    [Out] byte[] dest, 
    int sourceLength, 
    int maxDestLength 
); 

這樣稱呼它:

byte[] source = ...; 
byte[] dest = new byte[maxDestLength]; 
int retval = LZ4_compress_default(source, dest, source.Length, dest.Length); 
// check retval for errors 

我在函數因爲返回類型猜您在C聲明中忽略了這一點,但您的C#代碼表明它是int

+0

我發佈了code.I想知道爲什麼我得到訪問衝突異常 –

+0

因爲你的代碼有我描述的各種錯誤。我最後的要點是AV的最合理的原因。我猜你可能沒有意識到out byte [] dest'和'[Out] byte [] dest'是完全不同的。 –

+0

是的,我錯過了那個。謝謝。那是一個很好的幫助。非常感謝。我不熟悉C#所以我正面臨着這個問題。感謝很多。 –