2016-04-29 1 views
0

J'essaye d'implémenter un framework de plugin en C# où chaque plugin est chargé dans son propre AppDomain. J'ai des problèmes où il semble que la couche à distance entre AppDomains est garbage collecter mes instances de plugin. Chaque plugin hérite de cette classe:Objets dans AppDomain récupérés Garbage

public class PluginRefObject : MarshalByRefObject{ 
    public override object InitializeLifetimeService() { 
     return null; 
    } 
} 

Ce que je pensais donnerait à l'objet une durée de vie infinie. Cependant, les plug-ins semblent travailler pour un peu et puis tout à coup je reçois un RemotingException avec un message d'erreur:

Object 'longhexstring.rem' has been disconnected or does not exist at the server 

qui, de recherche sur Google, je crois signifie que le GC a supprimé mon objet distant. Dois-je faire autre chose pour garder cet objet en vie?

+0

Réponse possible: http://stackoverflow.com/a/6339701/1186321 – denvercoder9

+0

Oui, j'ai vu celui-là. Les liens sont mauvais et les fichiers .chm affichés ne seront pas ouverts. – spectacularbob

+0

Excuses; Je crois que cela pourrait être utile: https://msdn.microsoft.com/en-us/library/23bk23zc(v=vs.85).aspx – denvercoder9

Répondre

0

Il s'avère qu'une exception a été levée dans mon plugin, provoquant le déchargement de l'AppDomain.

C'était un peu un bug difficile cependant. Mon plugin a enregistré un TcpChannel et il y avait un point où je voulais que le TcpChannel soit déconnecté via ChannelServices.UnregisterChannel(). Apparemment, le fil de la chaîne continuait à fonctionner et asynchronisé un ObjectDisposedException la prochaine fois qu'il tentait d'accéder à la chaîne.

Après recherche sur Google, il semble qu'il n'y a aucun moyen propre de tuer un TcpChannel et la meilleure solution que j'ai trouvé pour le nettoyage d'un canal dans un autre AppDomain est juste pour décharger le AppDomain