Pregunta

Necesito llamar a un dll externo desde c #. Esta es la definición del encabezado:

enum WatchMode { 
   WATCH_MODE_SYSTEM = 0,          
   WATCH_MODE_APPLICATION  = 1 };  

LONG ADS_API WDT_GetMode ( LONG i_hHandle, WatchMode * o_pWatchMode );

He agregado la enumeración y la llamada en C #:

public enum WatchMode
{
    WATCH_MODE_SYSTEM = 0,
    WATCH_MODE_APPLICATION = 1       
}
[DllImport("AdsWatchdog.dll")]
internal static extern long WDT_GetMode(long hHandle, ref WatchMode watchmode);

Esto genera una excepción AccessViolationException. Sé que el dll está 'funcionando' porque también he agregado una llamada a GetHandle que devuelve el hHandle mencionado anteriormente. He intentado cambiar el parámetro a un int ( ref int watchmode ) pero aparece el mismo error. ¿Alguien sabe cómo puedo hacer la llamada de arriba?

¿Fue útil?

Solución

Se encuentra con una diferencia de problema de tamaño de parámetro entre C # y C ++. En el mundo C ++ / windows LONG es un entero con signo de 4 bytes. En el mundo C #, es un entero de 8 bytes con signo. Debe cambiar su firma de C # para tomar un int.

ffpf está equivocado al decir que debe usar un IntPtr aquí. Solucionará este problema particular en una máquina de 32 bits ya que un IntPtr se ordenará como int. Si ejecuta esto en una máquina de 64 bits, volverá a aparecer como un entero con signo de 8 bytes y se bloqueará.

Otros consejos

El equipo de interoperabilidad administrado, nativo y COM lanzó el asistente de interoperabilidad PInvoke en codeplex. Tal vez pueda crear la firma adecuada. http://www.codeplex.com/clrinterop/Release/ProjectReleases. aspx? ReleaseId = 14120

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top