2014-08-31 36 views
-1

我有以下的本機C函數聲明,我想轉換到VB.NET的P/Invoke相當於以叫它:編組陣列作爲返回值P/Inoke .NET

unsigned char *h5d65bv(const unsigned char *a, const int alen) 

,你可以看到它,它返回一個字節數組,並將另一個字節數組a和它的長度(alen)作爲參數。

我用下面的簽名,根據.NET錯誤(「管理在‘返回值’/非託管簽名不匹配。」),這是不正確的:

<DllImport("mydll.dll", EntryPoint:="h5d65bv", BestFitMapping:=False, CallingConvention:=CallingConvention.Cdecl, ThrowOnUnmappableChar:=True, CharSet:=CharSet.Ansi)> _ 
    Friend Function h5d65bv(ByVal a As Byte(), <MarshalAs(UnmanagedType.I4)> ByVal alen As Int32) As Byte() 
    End Function 

那麼,哪一個是正確的「簽名」(它必須與數組和指針有關,但我沒有在因特網上找到關於數組的任何東西,如返回類型)?

+0

像'h5d65bv'這樣的名字是一個非常強烈的暗示,你將面臨很多麻煩。 – 2014-08-31 09:42:24

回答

1

實際上,返回類型只是一個指向unsigned char的指針。分配的字符數取決於函數的實現,.NET無法知道這一點。

你可以做的是使.NET部分的返回類型爲IntPtr,然後使用Marshall.Copy手動複製數組。但是,假設你知道數組的長度。

Dim ptr As IntPtr = h5d65bv(input, input.Length) 
Dim output As New Byte(100) 
Marshall.Copy(ptr, output, 0, 100) 

另一點是,你可能要釋放分配的內存,但是這還是取決於h5d65bv功能如何分配它。

+0

函數使用簡單的malloc語句分配數組。返回數組的長度是ALWAYS 20(意味着它存儲了20個字節,沒有更多,沒有什麼更少的) – Jason 2014-08-31 09:47:00