Question

J'ai un programme C # qui utilise une classe d'un autre assemblage et cette classe appelle une DLL non gérée pour effectuer certains traitements. Voici un extrait:

public class Util
{
    const string dllName = "unmanaged.dll";
    [DllImport(dllName, EntryPoint = "ExFunc")]
    unsafe static extern bool ExFunc(StringBuilder path, uint field);

    public bool Func(string path, uint field)
    {
        return ExFunc(new StringBuilder(path), field);
    }

    ...
}

Util util = new Util();
bool val = util.Func("/path/to/something/", 1);

Le problème que je rencontre est que si j'appelle "Func" mon programme principal C # ne sera pas déchargé. Lorsque j'appelle Close () dans mon formulaire principal, le processus sera toujours là si je regarde dans le Gestionnaire des tâches. Si je supprime l'appel à " Func " le programme se décharge bien. J'ai fait quelques tests et la fonction Main des programmes revient définitivement, donc je ne suis pas sûr de ce qui se passe ici.

Était-ce utile?

La solution

Avez-vous le code source correspondant à unmanaged.dll ? Il doit faire quelque chose, soit en démarrant un autre thread et en ne quittant pas, ou en bloquant dans DllMain , etc..

Autres conseils

Il semble que votre bibliothèque non gérée crée un thread pour le traitement asynchrone.

Les chances sont qu'il prend en charge une fonction d'annulation d'une certaine sorte; Je suggère que vous essayez d'appeler cela à l'arrêt du programme. Si votre programme vient juste de se terminer avant la fin de l'appel asynchrone, recherchez l'option "attendre la fin". et appelez-le avant de revenir de votre " Func " méthode.

Il est possible que vous envoyiez un thread hors arrière-plan qui ne se lâche pas à la fermeture de votre application principale. Je ne peux pas dire avec certitude sans voir le code, mais c’est ce que je suppose.

C'est probablement moins qu'idéal, mais si vous avez besoin d'une solution de contournement, vous pouvez probablement utiliser:

System.Diagnostics.Process.GetCurrentProcess().Kill();

Ceci finira votre application au niveau du processus et supprimera tous les threads générés par le processus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top