9
votes

Existe-t-il une bibliothèque complète de wrapper user32.dll disponible pour .NET?

Je fais beaucoup d'Interop pour user32.dll pour le moment via VB.NET. Comme User32.dll n'est pas au niveau .NET mais au niveau natif, je dois déclarer les fonctions à l'aide de la déclaration de déclaration. Bien que cela fonctionne bien, je continue à les déclarer encore et encore.

J'étais googling autour, mais le seul site utile que j'ai rencontré était pinvoke.net . Bien que cela contienne des informations dans une certaine mesure, il existe une multitude de fonctions non décrites ou avec beaucoup de pièces "TODO" dans la documentation de celui-ci.

Par conséquent, je me demandais s'il existe une enveloppe complète pour User32.dll disponible pour .NET. Je n'ai pas été capable de trouver que j'ai peur, mais peut-être que je ne cherche pas correctement.


0 commentaires

5 Réponses :


0
votes

Il existe plusieurs Générateurs de signature P / Invoke qui peut vous aider.


2 commentaires

Je vois, merci. Est-ce que je suis juste en pensant qu'il n'y a pas de dll wrapper ordinaire?


Au moins je n'ai jamais vu un. C'était probablement plutôt énorme et rendrait votre application inutilement grande. Je sais juste que l'emballage MSHTML est d'environ 7 Mo et c'est juste pour une application. Une autre raison pourrait être que différents systèmes d'exploitation ont différents ensembles de fonctions dans l'utilisateur32.dll.



7
votes

a em> complète em> wrapper pour user32.dll pour le framework .NET serait plutôt inutile. La grande majorité des fonctions exportées par User32.dll ont des fonctions correspondantes de manière nativement mise en œuvre par le .NET Framework. En fait, l'ensemble de la framework .NET est simplement une enveloppe autour de l'API Windows, y compris User32.dll.

Je vous recommande de ne pas essayer et invoquer des fonctions de user32.dll lorsqu'il y a un moyen de le faire via géré. Code à l'aide de la fonctionnalité déjà fournie par le .NET Framework. Vérifiez MSDN ou un guide de référence .NET pratique de votre choix pour cela en premier, avant d'essayer de réinventer le volant vous-même. P>

Si et lorsque vous déterminez que la fonction spécifique que vous devez avoir pas EM> avoir un équivalent natif, puis et seulement alors, alors devriez-vous considérer p / appeler l'API Windows. Dans ce cas, étant donné que vous avez considérablement réduit la quantité de fonctions que vous devez importer, il ne devrait s'agir que d'une quantité minimale de travail pour déterminer la signature de fonction à l'aide d'une combinaison de la documentation MSDN, pinvoke.net et débordement de pile. Je dirais que le bénéfice de l'écriture de ce code vous-même (maintenant que vous avez coupé ce que vous avez besoin à une taille plus gérable) est que vous êtes pratiquement tenu de lire la documentation et de comprendre exactement comment cela fonctionne. Si vous comptez sur le code écrit par quelqu'un d'autre, rien ne garantit qu'il est écrit correctement, qu'il suit les meilleures pratiques, qu'il met en œuvre toute manipulation des erreurs, ou même que vous comprenez comment cela fonctionne et comment l'utiliser. P> Enfin, je recommande que même dans VB.NET, vous utilisez la syntaxe C # standard pour les fonctions p / invoquant, plutôt que déclarer code>. Par exemple: P>

<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


4 commentaires

@Downvoter: Souhaitez-vous laisser un commentaire sur la partie de ma réponse que vous pensez être incorrecte?


Tout d'abord, merci pour votre explication claire. Je vois votre point, mais toutes les fonctions d'User32.dll ne figurent pas dans le cadre .NET. Je pense que je vais continuer à créer mon propre wrapper simple avec les fonctions qui ont besoin d'interopping que j'utilise le plus. Enfin, cependant, je ne vois pas pourquoi l'attribut Dllimport pourrait être bénéfique sur la déclaration de déclarer. Je suppose que vb.net a son mot clé distinct déclarer pour de telles choses, ce qui est également plus clair à mon avis que la notation que vous utilisez.


@PIMVDB: Je comprends la nécessité de p / invoquer certaines fonctions. J'ai une grosse bibliothèque d'emballage pour des objets avancés comme des crochets système de bas niveau. Je viens de remarquer dans votre question que vous recherchiez un wrapper complet , et je pense que ce serait une erreur, compte tenu du nombre de fonctions déjà implémentées dans le code géré pour vous par le .NET Framework. Et j'ai mis à jour ma réponse avec quelques raisons pour lesquelles je recommande sur déclarer .


Je suis désolé de ne pas être claire, mais je cherchais essentiellement un moyen d'empêcher toute copie-colle, je faisais constamment. Quoi qu'il en soit, vous avez été extrêmement utile, merci beaucoup.



0
votes

Je voudrais simplement utiliser l'enveloppe pré-construite appelée API Windows géré . Cela n'a pas tout, mais cela a la plupart des choses. Lorsqu'il est utilisé en relation avec le add-in Pinvoke.net Visual Studio Vous devriez avoir un moyen assez automatique de traiter ce problème .


0 commentaires

-1
votes

J'espère que l'URL suivante vous aidera.

http://mwinapi.sourceforge.net/


0 commentaires

2
votes

the Vanara Project implémente presque toutes les API Windows Win32. Il est disponible chez GitHub ou sous forme de packages Nuget. Les développeurs réagissent extrêmement rapidement aux problèmes et aux demandes.

the user32.dll est également complètement complètement disponible. Appelez simplement le gestionnaire de packages Visual Studio et référence à vanara.pinvoke.user32

 Entrez la description de l'image ici


0 commentaires