2012-03-05 12 views
5

¿Cuál es la diferencia entre los usos de DllImport aquí? Específicamente, ¿significa "usuario32" "usuario32.dll", o significa "usuario32.lib" o algo más?DllImport user32 vs user32.dll

[DllImport("user32")] 
protected static extern int GetKeyboardState(byte[] pbKeyState); 

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
protected static extern short GetKeyState(int vKey); 

Probablemente pueda ignorar CharSet y CallingConvention.

Si son iguales, puedo reescribir esto para ser más consistente, pero si no, no quiero tener un montón de problemas con él.

+0

[Aquí está la página de MSDN en el constructor] (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.dllimportattribute.aspx) para referencia. – Guvante

+0

La documentación relevante es la de [LoadLibrary] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175 (v = vs.85) .aspx). * Si la cadena especifica un nombre de módulo sin una ruta y se omite la extensión del nombre de archivo, la función agrega la extensión de biblioteca predeterminada .dll al nombre del módulo. Para evitar que la función agregue .dll al nombre del módulo, incluya un carácter de punto final (.) En la cadena del nombre del módulo. * –

Respuesta

11

En este ejemplo, no hay diferencia. La extensión .dll se agregará automáticamente al "user32" para crear "user32.dll". Sin embargo, este no es siempre el caso. Si el nombre del archivo de la biblioteca contiene un punto, la extensión .dll se no se adjuntará automáticamente.

Algunos ejemplos:

[DllImport("user32")] -> resuelve "User32.dll". Correcto.

[DllImport("user32.dll")] -> Resuelve "User32.dll". Correcto.

[DllImport("mylib.version5")] -> Resuelve "mylib.version5". incorrecta

[DllImport("mylib.version5.dll")] -> Resuelve "mylib.version5.dll". Correcto.

+0

Parece que en la implementación Mono de .NET, los períodos en el nombre de la biblioteca no impiden la adición automática de extensiones (Al menos en la versión de Mono utilizada en Unity 4.5.1, que creo que es una variante de Mono 3.0.) – yoyo

+0

+1 para el "período en el nombre del archivo de la biblioteca", me he estado rascando durante horas sobre eso (que es bastante obvio ahora). – helmesjo

1

En Windows no hay diferencia, la importación se realizará con éxito si omite la extensión. Normalmente se desea omitir la extensión cuando se ejecuta Mono con la sección de configuración <dllmap>, donde el tiempo de ejecución de P/Invoke buscará alias.

Cuestiones relacionadas