2015-10-24 6 views
-2

Мне нужно передать массив байтов в memset, из-за которого P/Invoke clunkiness принимает IntPtr. Протестировано вручную, это работает, но я ищу теоретическое подтверждение. Правильно ли этот метод?Передача байта [] as 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

Нет «chunkiness». Ваша ошибка не объявляла аргумент * dest * логическим путем. Это должно быть 'byte []'. Удалите дополнительную chunkiness, объявив второй аргумент обычным способом, 'byte'. Не-коренастый маркер-пинвокер заботится обо всем остальном. –

+0

Я имел в виду неряшливость, ошибку. Сожалею. – ArekBulski

+0

@Hans Второй параметр: 'int':' void * memset (void * dest, int c, size_t count); ' –

ответ

1

Ваш код в порядке и будет работать правильно.

Было бы совершенно разумно и намного яснее, на мой взгляд, избегать unsafe и объявлять параметр memset равным byte[]. Я объявляю это так:

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

Обратите внимание, что последний параметр является size_t, который является указателем размера.

Я также задаюсь вопросом, почему вы предпочитаете делать это вообще в неуправляемом коде, но, предположительно, у вас есть свои причины.

+0

Подпись PInvoke была получена от pinvoke.net. Я тестирую производительность разных методов, причем одним из них является native memset. – ArekBulski

+0

Вы можете объявить его с помощью 'byte []' для удобства. Я не вижу, чтобы это улучшилось. –