Во-первых, PInvoke.net ваш друг.
Во-вторых, ваши преобразования верны, за исключением того, что вы должны использовать StringBuilder
для функций, которые принимают char*
в качестве буфера для заполнения ([in out]
).
Ваш дисбаланс в стеке может быть вызван использованием различных соглашений о вызовах. Соглашение о вызовах по умолчанию для C # - __stdcall
, но ваша функция C, вероятно, __cdecl
. Если это так, вам нужно добавить CallingConvention к вашему атрибуту DLLImport
.
РЕДАКТИРОВАТЬ: Кроме того, как отметил Груо, если аргументы указателя в вашей функции C на самом деле просто указатели на unsigned int
(например, в отличие от ожидания массива int
), то вы должны использовать ref uint
вместо int[]
.