как использовать обратный вызов cdecl с pinvoke - PullRequest
9 голосов
/ 09 февраля 2011

У меня есть библиотека c, которая имеет обратные вызовы cdecl. Как я могу использовать их с C #.

Кажется, все говорят, что они должны быть обратными вызовами stdcall

, чтобы быть ясным:

delegate int del();
[dllimport("mylib.dll",CallingConvention=CallingConvention.Cdecl)]
public static extern int funcwithcallback(del foo);

где del должен называться cdecl-wise

Ответы [ 2 ]

15 голосов
/ 09 февраля 2011

Взгляните на это.Функциональность существует с 1.1, поэтому она должна охватывать любую версию .NET, которую вы используете.Вам просто нужно указать CallingConvention.

Документация CallingConvention на MSDN

Вы также можете посмотреть эту статью о проекте кода:

Использование соглашения о вызовах _CDECL в C #

РЕДАКТИРОВАТЬ: Кроме того, вот пример из FreeImage.NET.

static FreeImage_OutputMessageFunction freeimage_outputmessage_proc = NULL;
DLL_API void DLL_CALLCONV
FreeImage_SetOutputMessage(FreeImage_OutputMessageFunction omf);

Затем на стороне C # просто:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void FreeImage_OutputMessageFunction(FREE_IMAGE_FORMAT
format, string msg);

[DllImport(dllName, EntryPoint="FreeImage_SetOutputMessage")]
public static extern void SetOutputMessage(FreeImage_OutputMessageFunction
omf);
0 голосов
/ 09 февраля 2011
  1. Скомпилируйте с .NET 2.0, используйте компилятор 2005 года! *
  2. Обратное направление аргумента.

Это работает благодаря некоторому защитному коду, добавленному компилятором 2005 года.

РЕДАКТИРОВАТЬ: не пытайтесь сделать это, если вы можете сделать шим в нативный код

...