2010-10-13 8 views
2

Y a-t-il un moyen de libérer un objet auquel on a accédé en utilisant la liaison tardive (c'est-à-dire créé par la méthode Activator.CreateInstance())?Publication d'un objet à liaison retardée dans C#

J'ai une application qui transforme les fichiers d'un format à un autre. Les assemblys qui effectuent ces traductions résident dans un dossier de mon répertoire d'applications. Lorsque l'application démarre pour la première fois, je peux supprimer ces assemblys du dossier de traduction sans aucune erreur. Cependant, une fois que je traite un document via l'application (et que je me suis lié à l'un des assemblages de traduction en utilisant la liaison tardive), je ne peux plus supprimer les assemblages de traduction. À ce stade, je reçois un message d'erreur indiquant que le fichier est "utilisé par une autre application".

Existe-t-il un moyen de "libérer" l'objet lié en retard dans mon application une fois que j'ai fini de l'utiliser?

+0

double possible [C# - Chargement .NET Assembly dans Separate AppDomain Vous pouvez donc videz-] (http: // stackoverflow.com/questions/1228554/c-loading-net-assembly-into-seperate-appdomain-so-you-can-unload-it) –

Répondre

1

une fois qu'un ensemble est chargé dans un domaine d'application, elle reste jusqu'à ce que le domaine de l'application s'arrête.

Pour contourner cette charge l'ensemble dans son propre domaine d'application, par exemple:

AppDomain app = AppDomain.CreateDomain("PlugInDomain"); 
ObjectHandle objectHandle = app.CreateInstanceFrom(assemblyPath, 
      "MyNamespace.MyComponent"); 
MyComponent component = (MyComponent) objectHandle.Unwrap(); 

// do stuff 

// Now kill app domain, assembly can be overwritten after this. 
AppDomain.Unload(app); 
+0

Parfait !! Merci Kev !! – pmartin

0

Une fois qu'un assembly est chargé dans l'AppDomain en cours d'exécution, il ne peut pas être déchargé (qu'il soit créé par réflexion avec Activator.CreateInstance).

L'approche recommandée ici consiste à implémenter un AppDomain secondaire avec une durée de vie pouvant être déchargée lorsqu'il souhaite disposer des assemblys. Il y a des tonnes d'exemples, mais en voici un: http://www.dotnet247.com/247reference/msgs/28/142174.aspx. Étant donné que la gestion de la durée de vie des AppDomains secondaires peut poser problème, si vous utilisez ASP .NET et que vous souhaitez charger de nombreux assemblages dynamiques, vous pouvez vérifier si votre AppDomain actuel est saturé d'assemblys chargés dynamiquement par la liaison à l'événement AppDomain.CurrentDomain.AssemblyLoaded et en comptant le nombre, demande alors l'environnement d'hébergement recycler le AppDomain actuel quand il frappe un nombre critique (disons 500) comme:

HostingEnvironment.InitiateShutdown(); 
Questions connexes