преобразование типов данных c -> c # при использовании нативных функций из dll - PullRequest
0 голосов
/ 08 июня 2011

Этот список верен?

unsigned int(c) -> uint(c#)
const char*(c) -> String(c#)
unsigned int*(c) -> uint[](c#)
unsigned char*(c) -> byte[](c#)

Я думаю, что здесь есть ошибка, потому что с этими 4 параметрами для встроенной функции у меня есть PInvokeStackImbalance.

C функция:

bool something
  (unsigned char *a,
   unsigned int a_length,
   unsigned char *b,
   unsigned int *b_length);

PInvoke - это:

[DllImport(@"lib.dll", EntryPoint = "something")]<br>
public static extern bool something(
    byte[] a,
    uint a_length,
    byte[] b,
    uint[] b_length);

1 Ответ

2 голосов
/ 08 июня 2011

Во-первых, PInvoke.net ваш друг.

Во-вторых, ваши преобразования верны, за исключением того, что вы должны использовать StringBuilder для функций, которые принимают char* в качестве буфера для заполнения ([in out]).

Ваш дисбаланс в стеке может быть вызван использованием различных соглашений о вызовах. Соглашение о вызовах по умолчанию для C # - __stdcall, но ваша функция C, вероятно, __cdecl. Если это так, вам нужно добавить CallingConvention к вашему атрибуту DLLImport.

РЕДАКТИРОВАТЬ: Кроме того, как отметил Груо, если аргументы указателя в вашей функции C на самом деле просто указатели на unsigned int (например, в отличие от ожидания массива int), то вы должны использовать ref uint вместо int[].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...