2012-12-27 1 views
1

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

+2

Avoir un regardez [AppDomains] (http://msdn.microsoft.com/en-us/library/system.appdomain.aspx) vous pouvez les décharger ... – rene

Répondre

1

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).

+0

Je pense, je devrais essayer ceci avec "assemblées de collection". Merci . – Lispwave

1

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).

+0

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

+0

@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 –

+0

@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

0
  • 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
+0

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

+0

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

+0

@TomTom: Vous avez fait 5 fautes de frappe en 1 phrase, mon pote :)) – abatishchev

Questions connexes