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.

  1. Créer un nouveau AppDomain
  2. Charger la DLL dans la nouvelle DLL
  3. Faire le travail dans le nouveau AppDomain
  4. 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

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