2009-07-08 5 views
1

J'ai utilisé WPF pendant quelques années maintenant et je n'ai aucune expérience avec autre chose que du code managé. J'ai commencé à écrire une application qui utilise beaucoup de win32 interop et j'ai commencé à me demander si je perdais de la mémoire ou si je faisais généralement quelque chose de stupide que je ne connaissais pas ... Alors j'ai pensé que je chercherais un conseil!Utilisation de win32 dans le code managé

Y at-il/Gotchas conseils/astuces lors de l'utilisation du code managé win32 appels à l'intérieur? Je suis surtout intéressé par la collecte de mémoire/garbage mais tous les autres conseils sont les bienvenus!

Répondre

4

Il n'y a pas de pièges. Vous libérez toutes les ressources que vous allouez (sauf si la documentation indique que l'appel que vous effectuez prend en charge la ressource, vous libérant de la propriété), et c'est tout ce qu'il y a à faire. Le GC n'y participe pas du tout.

En tant que conseil, System.Runtime.InteropServices.SafeHandle est une classe d'aide d'actions à utiliser les poignées Win32 style RAII.

3

ressource que presque vous allouez dans Win32 doit être désallouée avec l'appel droite API, qui est inscrite sur la page MSDN pour l'API d'allocation.

Ceci est un processus entièrement manuel; la collecte des ordures ne vous aide pas du tout, bien que vous puissiez utiliser SafeHandle ou les finaliseurs (dernier recours).

À tout le moins, utilisez IDisposable classes wrapper autour de toutes les ressources que vous allouez. Dans certains cas, ceux-ci existent déjà dans Windows Forms.

Vous pouvez utiliser Perfmon ou le Gestionnaire des tâches pour surveiller le nombre de poignées ouvertes dans votre processus.

1

Le problème principal avec win32 interop est (évidemment) incompatibilité Linux/Mac OS (Mono ne pourra pas encore vous aider si vous avez des bibliothèques P/Invokes vers win32). En dehors de cela, je n'ai pas connaissance de problèmes. Sauf, bien sûr, la fonction que vous appelez elle-même fuit la mémoire.

1

Vous devez être prudent si vous devez appeler le GetLastError pour déterminer pourquoi un appel win32 a échoué. This page fournit une description détaillée.

Questions connexes