Décharger dll COM du programme .Net
Question
Nous avons une application .Net à partir de laquelle un composant C ++ COM est instancié. On charge le composant COM à partir d'une fenêtre de formulaire enfant. Il est une ressource commune qui est en cours de modification par l'application .Net, qui est inturn utilisé par le dll COM pour démarrer.
Lorsque la séquence des étapes suivantes sont effectuées:
1. Instantiate composant COM dans la nouvelle fenêtre enfant
Le composant COM est instancié, et est utilisé par la forme de l'enfant, et après avoir été utilisé, il est NULL, en espérant que le composant COM serait déchargé.
2. Gardez fenêtre enfant ouvert, puis modifiez la ressource
3. Maintenant, allez « rafraîchir » la forme, pour créer une nouvelle instance de COM, pour voir le refelection de la ressource modifiée -. Mais la ressource n'est pas rafraîchi
Nous avons également utilisé la méthode Marshal.ReleaseComObject, mais sans succès. S'il vous plaît conseiller.
Pas de solution correcte
Autres conseils
Une fois une DLL est chargée dans un .Net AppDomain, il est possble de forcer une DLL à décharger. Il est une limitation malheureuse du CLR. Si vous avez besoin absolument la DLL pour vous décharger pouvez faire ce qui suit.
- Créer un nouveau AppDomain
- Charger la DLL dans la nouvelle DLL
- Faire le travail dans le nouveau AppDomain
- Décharger le nouveau AppDomain
Si une DLL est uniquement chargé dans un AppDomain, le déchargement AppDomain déchargera la DLL ainsi. Donc, cela va obtenir le DLL déchargé. Cependant, il est une réponse assez lourd.
COM objet et DLL sont deux choses différentes, même si l'on réside dans un autre. Certains hacks sont possibles, mais bien meilleure solution consiste à réécrire cette partie d'une manière plus sensible qui ne repose pas sur le déchargement de DLL.
discussion sur page clrInterop décrit très près ce que vous avez décrit dans votre question. Le garbage collector ne décharge pas la dll native. Je cite: ". Il pourrait être très dangereux pour clr faire cela parce qu'il pourrait y avoir d'autres codes (même code natif) qui dépend de cette dll Si vous assurer que dll n'est pas utilisé plus, appeler une API Windows comme FreeLibrary peut être plus simple pour décharger le dll. "
Vous aurez besoin de interop FreeLibrary et l'utiliser pour décharger le dll natif. Bien que je pourrais ajouter:. Ne pas si vous pouvez essayer de trouver une solution où vous n'avez pas besoin de décharger la dll