C# code à exécuter du code dans un autre domaine d'application?
J'ai un programme qui s'exécute pendant 24 heures, puis redémarre.
Comment puis-je modifier main() partir dans un autre domaine d'application, qui est déchiré vers le bas et actualisés toutes les 24 heures, afin d'éliminer d'éventuelles fuites de mémoire?
- Sont ceux de la Fenêtre de Services?
- Double Possible avec: Obtenir l'accès à l'AppDomain dans une autre application? stackoverflow.com/questions/6529249/...
Vous devez vous connecter pour publier un commentaire.
Vous m'avez eu droit jusqu'à ce que vous avez dit:
Si vous voulez exécuter du code dans un autre domaine d'application, puis il ya beaucoup de ressources sur la façon de le faire, par exemple L'exécution de Code dans un Autre Domaine d'Application (C# et Visual Basic). Le principe de base est de créer une classe qui hérite de
MarshalByRefObject
. Vous créez ensuite votre nouveau domaine d'application et de le charger de créer une instance de cet objet, cet objet est alors votre "point d'entrée" dans votre domaine d'application:Cependant en C# il n'est pas vraiment une telle chose comme une "fuite de mémoire", au mieux, vous avez juste des objets qui sont par mégarde conservés dans la portée. Si c'est le cas, alors un domaine d'application est simplement surpuissant - tout ce que vous devez faire est de supprimer les références à des objets gérés qui ne sont plus nécessaires et le Garbage Collector de l'ordre pour vous.
Si vous avez une véritable fuite de mémoire dans le code non managé une application de domaine ne vous aidera pas non plus. Non géré types ne sont pas limitées par application de domaines, de sorte que tout non géré la mémoire allouée à l'intérieur du domaine de l'application ne sera pas libérée lorsque le domaine d'application est détruit. Dans ce cas, vous feriez mieux d'utiliser des processus distincts au lieu.
AppDomain
à nettoyer quand il est "fermé" (y compris les ressources non managées) -- comme windows le fait pour un Processus quand il est sorti. Malheureusement, cependant, il n'existe aucun moyen (que je suis au courant) pour décharger un chargéAppDomain
. L'un des principaux inconvénients de par programme de chargement de votre propre application dans les domaines de la mémoire, c'est qu'il va introduire des fuites de mémoire. ChaqueAppDomain
vous charger en mémoire jusqu'à ce que le processus s'arrête.AppDomains
avecAssemblies
(tout à fait ridicule de moi, je sais!). Merci pour la correction moi. -- (Pour les autres: Voir Jason Zander blog: "Pourquoi n'est-ce pas là une Assemblée.Décharger méthode?")J'ai créé une classe qui permet d'exécuter du code dans un autre domaine d'application, ce qui vous permettra de disposer le domaine d'application et de le recréer: L'exécution de Code dans un autre Domaine d'Application à l'Aide de C#
Vous ne pouvez pas. Un processus est isolé et indépendant, et vous ne pouvez pas transférer un thread d'un processus d'un autre processus.
Ce que vous pouvez faire, cependant, si vous ne pouvez absolument pas corriger les fuites de mémoire en interne est de créer un programme de surveillance qui lance l'application à chaque fois qu'il s'arrête en cours d'exécution, et de configurer votre application pour être exécuté uniquement dans le seul mode d'exécution.