2011-05-10 1 views
2

Ma compréhension actuelle des types générés dynamiquement est la suivante:Existe-t-il un moyen de créer des types dynamiques à l'exécution sans les avoir en permanence dans le domaine de l'application?

Si vous générez un type via CodeDom et de le charger dans un AppDomain, il n'y a aucun moyen de décharger ce type (c.-à-Assembly.Unload(...) n'existe pas) sans détruire l'AppDomain dans son ensemble.

Y a-t-il d'autres idées sur la façon de créer des types personnalisés lors de l'exécution?

Le mot-clé C# 4.0 dynamic peut-il être utilisé de façon magique? Est-ce que le .NET 4 ExpandoObject pourrait être utilisé de manière agréable?

Les types anonymes et le mot-clé dynamique peuvent-ils être combinés avec une certaine technique ?! Il sent comme nous avons les outils dispersés qui pourraient réaliser quelque chose d'utile. Mais je peux me tromper.

Répondre

2

Une fois qu'un assembly ou un type a été chargé dans l'AppDomain, il est là jusqu'à ce que l'AppDomain soit détruit, point, sans exception.

C'est pourquoi CodeDom est un pur mal lorsqu'il est utilisé dans tout type de volume. C'est une fuite de mémoire garantie et un problème de performance. Chaque compilation avec CodeDom génère un nouvel assemblage. Je pense que vous avez quelques options:

  1. Exécutez un AppDomain en mode sandbox pour vos types dynamiques. Exécutez votre AppDomain principal dans un environnement où les recyclages et la mise en pool sont acceptables. Évidemment, dans une application client, ce n'est pas possible, mais si vous utilisez ASP .NET, vous pouvez ajouter du code qui surveille le nombre d'assemblys chargés dans votre AppDomain et demande un recyclage lorsque ce nombre atteint un point critique. Ensuite, il suffit d'avoir IIS pool votre application Web et vous avez toujours la haute disponibilité, car vous avez plusieurs AppDomains en cours d'exécution à la fois.

  2. Utilisez TypeBuilder et Reflection.Emit. Cela vous permet d'utiliser un ensemble dynamique pour tous vos types générés dynamiquement. Si vous souhaitez générer dynamiquement du code de style C# comme vous pouvez le faire avec CodeDom, vous pouvez toujours l'utiliser en conjonction avec TypeBuilder, afin que votre code C# dynamique soit compilé vers un TypeBuilder dans un assemblage dynamique, au lieu d'un nouveau assemblage à chaque fois. Pour ce faire, vous pouvez utiliser MCS (Mono Compiler Service). Vous pouvez lui passer des classes au format C# et avec un peu de peaufinage, vous pouvez le faire compiler votre code vers un seul assemblage dynamique. Voir Mono Compiler as a Service (MCS)

+0

Merci pour une rédaction vraiment utile. 2 est où nous étions, 4 sons intéressants, se penchera sur MCS. – joshcomley

Questions connexes