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:
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.
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.
@Downvoter: ¿Desea dejar un comentario sobre qué parte de mi respuesta cree que es incorrecta? –
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
@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'. –