2015-10-24 91 views
-2

我需要傳遞一個字節數組到memset,由於P/Invoke clunkiness需要IntPtr。手工測試,它可行,但我正在尋求理論上的確認。這種方法是否正確?作爲IntPtr通過PInvoke傳遞給memset

[DllImport("msvcrt.dll", EntryPoint = "memset", CallingConvention = CallingConvention.Cdecl, SetLastError = false)] 
public static extern IntPtr MemSet(IntPtr dest, int c, int count); 

static unsafe void ZeroMemset (byte[] data) 
{ 
    fixed (byte* bytes = data) { 
     MemSet ((IntPtr)bytes, 0, data.Length); 
    } 
} 
+1

沒有「塊狀」。你的錯誤並不是以邏輯方式宣佈* dest *參數。它應該是'byte []'。通過聲明第二個參數以及正常的方式來移除額外的塊,'byte'。非粗壯的拼貼編組負責照顧其他所有內容。 –

+0

我的意思是笨拙,是一個錯誤。抱歉。 – ArekBulski

+0

@Hans第二個參數是'int':'void * memset(void * dest,int c,size_t count);' –

回答

1

您的代碼很好,並且能正常工作。

在我看來,避免unsafe並將參數memset聲明爲byte[]是完全合理的,並且在我看來更清楚。最終的參數是size_t是指針大小

[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern IntPtr memset(byte[] dest, int c, IntPtr count); 

注:我想聲明它是這樣的。

我也想知道爲什麼你選擇在非託管代碼中這樣做,但大概你有你的理由。

+0

PInvoke簽名來自pinvoke.net。我正在測試不同方法的性能,本地memset就是其中之一。 – ArekBulski

+0

爲了方便起見,你可以用'byte []'聲明它。我看不到那被改善。 –