J'ai un objet géré dans un fichier C# dll qui gère un descripteur d'entier anonyme pour un objet non géré dans une DLL C++. À l'intérieur de la DLL C++, l'entier anonyme est utilisé dans un fichier std :: map pour récupérer un objet C++ non géré. Grâce à ce mécanisme, je peux maintenir une association libre entre un objet géré et non géré à l'aide d'un descripteur d'entier anonyme.Gestion des destructeurs d'objets gérés (C#) et non gérés (C++)
Dans la méthode finalize (destructeur) de l'objet géré, j'ai un appel dans la DLL non managée pour supprimer l'objet non géré.
Tout va bien car le programme C# s'exécute, mais j'ai un problème quand le programme se termine. Étant donné que je n'ai aucun contrôle sur l'ordre des opérations de suppression du côté géré, la DLL non managée est supprimée de la mémoire AVANT tout objet géré. Ainsi, lorsque le destructeur de l'objet géré est appelé (qui à son tour appelle le destructeur non géré [au moins indirectement]), l'objet non géré a déjà été supprimé et le programme se bloque.
Comment puis-je supprimer en toute sécurité un objet non géré dans une DLL C++ externe associée à un objet géré dans un programme C#.
Merci
Andrew
Le véritable problème est le couplage très lâche. Avec juste une poignée, l'application ne pense pas qu'il y a des dépendances et en tant que telle, elle peut décharger dans n'importe quel ordre. Une chose qui pourrait l'aider à établir au moins une référence forte qui devrait s'assurer que la DLL managée sera déchargée avant le non managé. Cela n'a pas besoin d'être la référence que vous utilisez actuellement, juste une référence forte devrait être bonne. J'ai développé un système avec des milliers de références à DLL non-mm en utilisant C++ géré et n'ai pas rencontré ce problème. Le C++ géré pourrait également être une solution possible. –
@Jim: Suivre le modèle 'IDisposable' recommandé devrait résoudre ce problème, car les objets seront (ou devraient) être éliminés avant le début du déchargement. –