2011-03-01 7 views
15

he tenido este problema con C# cuando yo estaba usando DotNet1.1Cambio de una convención de llamada de C# delegado a CDECL

El problema es el siguiente. Tengo un dll no administrado, que tiene una función que toma un puntero de función (entre otros argumentos). Cuando declaro el DLLImport en código C#, paso un delegado. Pero los delegados en C# tienen la convención de llamadas stdcall mientras que la función no administrada espera un puntero de función cdecl. Por lo tanto, mi enfoque ingenuo resultó en bloqueos. Luego encontré lo siguiente: http://www.codeproject.com/KB/cs/cdeclcallback.aspx Un tipo escribió una excelente biblioteca que permite cambiar las convenciones de llamadas del delegado por, como yo entendía, MSIL-hacking. Las cosas fueron bien, hasta ...

He migrado a VS2008 y la nueva versión de .NET. En esta versión, la biblioteca mencionada no funciona. No soy realmente un experto en C# o .NET, y, a decir verdad, apenas entiendo lo que hace su biblioteca (aunque es de código abierto), así que ni siquiera quiero tratar de adaptarlo a .NET nuevo. Sin embargo, espero que la versión más nueva de C# tenga alguna solución mejor disponible para mi problema.

Por lo tanto, lo que los expertos, por favor me ayudan con mi dolor en las nalgas :)

Respuesta

40

Por defecto, el p/sistema de invocan envuelve su delegado en una función stdcall. Puede cambiar convención de llamada del contenedor generado mediante el atributo UnmanagedFunctionPointer:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)] 
public delegate void MyDelegate(); 
+0

¿Puedo asignar una función normal de C# a ella? –

+0

Sí, puedes hacer eso. –

+0

Muchas gracias. Funciona perfectamente. ¡Salvaste mi día! –

Cuestiones relacionadas