2011-07-03 10 views
7

Estoy usando OpenTK OpenGL wrapper. Como carga OpenGL dll (o .so en Linux), contiene muchas funciones importadas de DLL.Cómo comprobar si el punto de entrada de DLL existe en C# sin llamar a la función

El problema es que algunos controladores no exportan todas las funciones. ¿Hay alguna manera de verificar si el punto de entrada existe? Necesito hacer esto, ya que llamar a la función en los sistemas que lo tienen provocará un bloqueo si no se realiza en la secuencia correcta. Por lo tanto, la captura de la excepción EntryPointNotFound no funciona en mi caso.

Respuesta

8

Puede P/Invocar el LoadLibrary y GetProcAddress llamadas de Win32:

[DllImport("kernel32", SetLastError=true)] 
static extern IntPtr LoadLibrary(string lpFileName); 

[DllImport("kernel32", CharSet=CharSet.Ansi, ExactSpelling=true, SetLastError=true)] 
static extern UIntPtr GetProcAddress(IntPtr hModule, string procName); 

Uso LoadLibrary para cargar el módulo y obtener el mango, y GetProcAddress para obtener un puntero de función en el punto de entrada. Si este último devuelve un error, el punto de entrada no existe.

+1

En realidad, no necesita verificar el código de error en la llamada a GetProcAddress. Simplemente verifique si el valor de retorno es 0 o no. Un valor de retorno de 0 (que en realidad es un puntero) indica que no se ha exportado ningún símbolo de ese nombre. –

Cuestiones relacionadas