通过PInvoke将byte []作为IntPtr传递给memset

时间:2015-10-24 21:42:58

标签: c# pinvoke memset intptr

我需要将一个字节数组传递给memset,由于P / Invoke clunkiness需要IntPtr。手工测试,它的工作原理,但我正在寻求理论上的确认。这种方法是否正确?

[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 个答案:

答案 0 :(得分:1)

您的代码很好,可以正常使用。

在我看来,避免unsafe并将memset的参数声明为byte[]是完全合理的,而且更加清晰。我会这样声明:

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

请注意,最后一个参数是size_t,它是指针大小的。

我也很想知道你为什么选择在非托管代码中执行此操作,但可能你有理由。