2010-12-31 19 views
6

Estoy haciendo una gran cantidad de interoperabilidad a user32.dll en este momento a través de VB.NET. Como user32.dll no está en el nivel .NET pero a nivel nativo, necesito declarar las funciones usando la declaración Declare. Aunque esto funciona muy bien, sigo declarándolos una y otra vez.¿Hay disponible una biblioteca de contenedor user32.dll completa para .NET?

Estaba buscando en Google, pero el único sitio útil que encontré fue pinvoke.net. Si bien contiene información hasta cierto punto, hay un buen número de funciones que no se describen o con muchas partes "HECHAS" en la documentación del mismo.

Por lo tanto, me preguntaba si hay un contenedor completo para user32.dll disponible para .NET. No he podido encontrar ninguno. Tengo miedo, pero quizás no estoy buscando correctamente.

Respuesta

5

A complete envoltorio para user32.dll para .NET Framework sería bastante inútil. La gran mayoría de las funciones exportadas por user32.dll tienen las funciones correspondientes implementadas de forma nativa por .NET Framework. De hecho, todo el .NET Framework es simplemente un envoltorio alrededor de la API de Windows, que incluye user32.dll.

Recomiendo que no intente y P/invoque las funciones de user32.dll cuando hay una forma de hacerlo a través del código administrado utilizando la funcionalidad que ya proporciona el .NET Framework. Consulte primero la MSDN o una práctica guía de referencia de .NET que prefiera antes de intentar reinventar la rueda usted mismo.

Si determina que la (s) función (es) específica (s) necesita no tienen un equivalente nativo, entonces y solo entonces debería considerar P/Invocar la API de Windows. En ese caso, dado que ha reducido sustancialmente la cantidad de funciones que tiene que importar, la determinación de la firma de la función con una combinación de la documentación de MSDN, pinvoke.net y Stack Overflow debería ser solo una cantidad mínima de trabajo. Yo diría que el beneficio de escribir este código usted mismo (ahora que ha reducido lo que necesita a un tamaño más manejable) es que prácticamente debe leer la documentación y comprender exactamente cómo funciona. Si confía en un código escrito por otra persona, no hay garantía de que esté escrito correctamente, que siga las mejores prácticas, que implemente cualquier manejo de errores, o incluso que usted entienda cómo funciona y cómo usarlo.

Finalmente, recomiendo que incluso en VB.NET, use la sintaxis estándar de C# para las funciones P/Invocar, en lugar de Declare. Por ejemplo:

<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _ 
Private Shared Function AppendMenu(ByVal hMenu As IntPtr, ByVal uFlags As MenuFlags, ByVal uIDNewItem As Int32, ByVal lpNewItem As String) As Boolean 
End Function 

Hay un par de razones por las que creo que esto es preferible:

  1. La sintaxis Declare es un intento de mantener la compatibilidad hacia atrás con la forma de VB 6 de hacer las cosas. La forma .NET oficial (comúnmente utilizada en C#) está utilizando el atributo <DllImport>, y como está escribiendo un nuevo código dirigido a .NET Framework, debería considerar utilizar la sintaxis oficial. El otro beneficio aquí es que su código será más familiar para las personas que usan C#, y serán más capaces de ayudarlo con sus declaraciones. Es más probable que las muestras que encuentre en línea se escriban de esta manera, en lugar de utilizar la sintaxis de estilo VB 6 heredada.

  2. A veces, la sintaxis Declare tiene un comportamiento inesperado.Por ejemplo, ciertos tipos se organizan de manera diferente a como están con la sintaxis estándar <DllImport>. Esto puede ser bastante confuso para las personas que están más familiarizadas con el comportamiento .NET estándar.

Consulte también this question para solucionar un problema similar.

+0

@Downvoter: ¿Desea dejar un comentario sobre qué parte de mi respuesta cree que es incorrecta? –

+0

Antes que nada, gracias por su clara explicación. Veo su punto, pero no todas las funciones de user32.dll están en .NET Framework. Creo que seguiré creando mi propio envoltorio simple con las funciones que necesito más. Por último, sin embargo, no veo por qué el atributo DllImport podría ser benificial en la declaración Declare. Supongo que VB.NET tiene su palabra clave separada Declare para tales cosas, que también es más clara en mi opinión que la notación que usas. – pimvdb

+0

@pimvdb: entiendo la necesidad de P/invocar ciertas funciones. Tengo una biblioteca de envoltura grande para cosas avanzadas como ganchos de sistema de bajo nivel. Acabo de notar en su pregunta que estaba buscando un contenedor * completo *, y creo que sería un error, teniendo en cuenta cuántas funciones ya ha implementado en el código administrado para usted el .NET Framework. Y actualicé mi respuesta con un par de razones por las cuales recomiendo '' sobre 'Declare'. –

1

Hay varios P/Invoke signature generators automáticos que pueden ayudarle.

+0

Veo, gracias. ¿Estoy en lo cierto al pensar que no hay una DLL simple? – pimvdb

+0

Al menos nunca vi uno. Probablemente se pondría bastante "enorme" y haría su aplicación innecesariamente grande. Solo sé que el contenedor mshtml ronda los 7 MB y solo es para una aplicación. Otra razón podría ser que diferentes SO tienen diferentes (sub) conjuntos de funciones en el user32.dll. –

Cuestiones relacionadas