2011-02-08 8 views
8

Tengo una biblioteca c que tiene devoluciones de llamada cdecl. ¿Cómo puedo usar estos de C#.cómo utilizar la devolución de llamada cdecl con pinvoke

Todo parece decir que deben estar devoluciones de llamada STDCALL

ser claro:

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

donde debe llamarse del cdecl-sabia

+0

¿Estás tratando de crear una 'devolución de llamada Cdecl' en C# (es decir, una función' Cdecl' que el código no administrado puede llamar), o es usted tratando de llamar a una función no controlada (es decir, C nativa) 'Cdecl' de C#? –

Respuesta

14

Echa un vistazo a esto. La funcionalidad ha estado presente desde 1.1, por lo que debería cubrir cualquier versión de .NET que esté utilizando. Solo tiene que especificar CallingConvention.

CallingConvention Documenation at MSDN

También puede buscar en este artículo sobre Proyecto de Código:

Using the _CDECL calling convention in C#

EDIT: Además, aquí es un ejemplo de FreeImage.NET.

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

Luego, en el # lateral C, simplemente:

[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

impresionante - gracias - exactamente lo que necesitaba – pm100

-1
  1. compilar con .NET 2.0, el uso Compilador 2005 !!
  2. Invierte la dirección del argumento.

Funciona debido a algún código de seguridad agregado por el compilador de 2005.

EDITAR: No intente esto si puede hacer una corrección en el código nativo.

+1

Hay más en 'cdecl' que solo el orden de los parámetros. 'StdCall' espera que la función llamada limpie la pila, mientras que' Cdecl' espera que la persona que llama limpie la pila. La combinación de las convenciones de llamadas dará como resultado un desequilibrio de pila. –

+0

@Jim: lo sé. Descubrí por accidente que el compilador de 2005 contiene una lógica de corrección cuando se hace una clasificación. Cuando me actualicé al compilador de 2010, no funcionó y me costó muchísimo averiguar por qué. – Joshua

Cuestiones relacionadas