Question

Y at-il un moyen de libérer un objet qui a été accessible à l'aide de liaison tardive (à savoir créé par la méthode Activator.CreateInstance())?

J'ai une application qui transforme les fichiers d'un format à l'autre. Les assemblées qui effectuent ces traductions vivent dans un dossier dans mon répertoire d'application.

Lorsque la première application démarre, je peux supprimer ces assemblages à partir du dossier de traduction sans aucune erreur. Cependant, une fois que je traite un document par l'application (et ont lié à l'un des ensembles de traduction à l'aide-liaison tardive), je ne peux plus supprimer les ensembles de traduction. À ce stade, je reçois un message d'erreur indiquant que le fichier est « utilisé par une autre application ».

Y at-il un moyen de « libérer » l'objet liaison tardive dans ma demande une fois que je suis fini de l'utiliser?

Était-ce utile?

La solution

Une fois un est chargé ensemble dans un domaine d'application, elle restera jusqu'à ce que se ferme de domaine de l'application vers le bas.

Pour contourner cette charge l'ensemble dans propre domaine d'application de, 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);

Autres conseils

Une fois que l'ensemble est chargé dans le domaine d'application d'exécution, il ne peut pas être déchargé (indépendamment du fait qu'il crée par réflexion avec Activator.CreateInstance).

L'approche recommandée ici est de mettre en œuvre un AppDomain secondaire avec une durée de vie qui peut décharger quand il veut disposer les assemblées.

Il y a des tonnes d'exemples, mais voici un: http://www.dotnet247.com/247reference/msgs/28/142174.aspx .

Depuis la gestion de la durée de vie AppDomains secondaire peut être une douleur, comme une alternative, si vous utilisez ASP .NET et cherchez à charger plusieurs ensembles dynamiques, vous pouvez vérifier quand est saturé courant votre AppDomain avec des ensembles chargés dynamiquement en se liant à l'événement AppDomain.CurrentDomain.AssemblyLoaded et le nombre maintenant, demande alors le recyclage de l'environnement qui héberge le AppDomain actuel quand il frappe un nombre critique (disons 500) comme:

HostingEnvironment.InitiateShutdown();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top