J'ai utilisé CSharpCodeProvider pour compiler et générer un nouvel espace de noms dans la mémoire pour un usage temporaire uniquement. Mais cet espace de noms devrait être supprimé de la mémoire après un certain laps de temps afin de permettre au code généré suivant de remplacer les mêmes identifiants de toutes les classes et méthodes générées.Libération de la mémoire du code généré par CSharpCodeProvider
Répondre
Un type chargé peut être déchargé d'une seule façon: s'il fait partie d'un collectible assembly.
Mais les assemblages de collection peuvent être créés uniquement à l'aide de Reflection.Emit et non de CSharpCodeProvider. Pour cette raison, je ne suis pas sûr si l'utilisation d'un assemblage de collection est une option pour vous. Sinon, vous aurez besoin d'une autre option (comme décharger AppDomains).
Je pense, je devrais essayer ceci avec "assemblées de collection". Merci . – Lispwave
Pas moyen. Le déchargement de classe se produit uniquement - attention - lors du déchargement d'un AppDomain. Votre meilleur pari est de faire toute la génération de code dans un domaine enfant-appdomain (sera le même processus), mais ce ne sera pas trivial (l'appdomain enfant a besoin de proxies de tous les objets accessibles via l'accès distant).
Y at-il une autre façon d'utiliser le code généré temporaire, puis le libérer de la mémoire? (Mais pas appdomains ...) Comment serait-il difficile d'utiliser child appdomain? Et comment exactement vais-je appeler la méthode à partir de là? childappdomain.namespace.type.method()? Je ne suis pas sûr si je vais réussir à faire face à cela de toute façon. – Lispwave
@DavidDiamond - En général, cela signifie que vous finirez par mettre 90% de votre code dans l'enfant AppDomain, pour éviter la plupart des problèmes de sérialisation/accès à distance –
@Simon Cela peut ne pas être vrai - cela dépend sérieusement de l'application. Mais ce n'est pas une entreprise légère pour un développeur junior - il faut savoir quelques internes et comment concevoir une application bien conçue. Mais il est encore assez simple par rapport à certains des arcanes internes de l'extension par exemple WCF ou travaillant avec Direct3d;) – TomTom
- charge générée assemblées dans l'enfant AppDomain
- Pour appeler par défaut AppDomain, pour une utilisation de commutation inter-domaines marshaled by reference proxies
- Ou utilisation WCF avec Named Pipe binding
- enfant Décharger AppDomain
Mais si je publie Appdomain, alors toutes ses instances seront également perdues. Ce sera le même que le redémarrage de l'application avant la mise à jour du code (ce qui est mauvais pour moi). Je pense que je vais essayer la solution "assemblage à collectionner". Si ça ne va pas aider, je vais essayer ICorDebug qui va résoudre mon problème finalement. (dans VS vous pouvez changer les objets source compilés pendant l'exécution en saison de débogage, c'est ce qu'on appelle le code Injection, et ce que j'essaye de faire d'une autre manière parce que ICorDebug est vraiment compliqué et énorme API) – Lispwave
bloc de script dans un domaine d'application SEAPARATE. Et l'utilisation de WCF est lente - la suppression de l'application de domaine est fortement optimisée. – TomTom
@TomTom: Vous avez fait 5 fautes de frappe en 1 phrase, mon pote :)) – abatishchev
- 1. Mieux comprendre la libération de la mémoire
- 2. Libération correcte et démappage de la mémoire du noyau
- 3. Nettoyage du code HTML généré par JQueryUI?
- 4. Libération java.util.LinkedList $ Mémoire d'entrée
- 5. Débogage du code généré par l'analyseur
- 6. exécution du code généré par javap -c
- 7. Mémorisation et libération de la mémoire
- 8. Question sur le code généré par g ++
- 9. UIViewController Animation libération de la mémoire
- 10. Libération de la mémoire de ID3D11Device :: CreateBuffer (...)
- 11. problème de libération de la mémoire
- 12. Gestion de la mémoire, libération nécessaire?
- 13. mémoire allouée libération
- 14. Mémoire de libération de Bitmapsources inutilisés
- 15. Problèmes avec libération de la mémoire
- 16. IMetaCollection/IEnumerable mémoire de libération
- 17. Code généré par le compilateur dans la couverture de code
- 18. libération de mémoire avec alloc
- 19. erreur de débogage lors de la libération de la mémoire
- 20. Déboguer/afficher la source du code Java généré par GWT
- 21. Code généré par le storyboard
- 22. CGBitmapContextCréer la responsabilité de la libération de la mémoire
- 23. Supprimer les résultats du code généré
- 24. Affectations de mémoire à libération automatique
- 25. TargetInvocationException avec les DLL générées par CSharpCodeProvider
- 26. Erreur de compilation lors de la compilation par CSharpCodeProvider
- 27. Copie de la récupération de place du code généré
- 28. bButton & CGGradient libération - fuites de mémoire
- 29. erreur de segmentation lors de la libération de la mémoire
- 30. Benchmarks du code généré par différentes versions de g ++
Avoir un regardez [AppDomains] (http://msdn.microsoft.com/en-us/library/system.appdomain.aspx) vous pouvez les décharger ... – rene