Domanda

C'è un modo per liberare un oggetto che è stato raggiunto usando late-binding (cioè creato dal metodo Activator.CreateInstance())?

Ho una domanda che i file si trasforma da un formato all'altro. Le assemblee che eseguono queste traduzioni vivono in una cartella nella mia directory dell'applicazione.

Quando l'applicazione viene avviata la prima volta, posso cancellare queste assemblee dalla cartella traduzione senza errori. Tuttavia, una volta ho elaborare un documento attraverso l'applicazione (e sono legato a uno dei gruppi di traduzione utilizzando late-binding), non riesco più a eliminare i gruppi di traduzione. A questo punto, sto ricevendo un messaggio di errore che indica che il file è "in uso da un'altra applicazione".

C'è un modo per "rilascio" l'oggetto tardo-bound nella mia applicazione una volta che ho finito di usarlo?

È stato utile?

Soluzione

Una volta che un assembly viene caricato in un dominio di applicazione che sarà rimangono fino a quando le chiude dominio applicazione verso il basso.

Per ovviare a questo caricare l'assembly in essa la propria dominio di applicazione, ad esempio:

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

Altri suggerimenti

Una volta che un assieme viene caricato nella esecuzione AppDomain, non può essere scaricato (indipendentemente dal fatto che sta creando tramite riflessione con Activator.CreateInstance).

L'approccio consigliato è quello di realizzare un AppDomain secondario con una durata che può scaricare quando vuole disporre complessi.

Ci sono tonnellate di esempi, ma qui è uno: http://www.dotnet247.com/247reference/msgs/28/142174.aspx .

Dal momento che la gestione del ciclo di vita di AppDomain secondari può essere un dolore, in alternativa, se si utilizza ASP .NET e stanno cercando di caricare molti assembly dinamici, è possibile verificare quando l'AppDomain corrente si satura di assembly caricati dinamicamente legandosi alla manifestazione AppDomain.CurrentDomain.AssemblyLoaded e il conteggio mantenendo, quindi richiedendo l'ambiente di hosting riciclo il dominio di applicazione corrente quando colpisce un numero critico (ad esempio 500), come:

HostingEnvironment.InitiateShutdown();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top