2010-04-26 10 views
18

Estoy intentando cargar un dll en una aplicación de consola y luego descargarlo y eliminar el archivo por completo. El problema que estoy teniendo es que el acto de cargar el dll en su propio AppDomain crea una referencia en el Dominio de la Aplicación Principal, lo que no me permite destruir el archivo dll a menos que apague totalmente el programa. ¿Alguna idea sobre cómo hacer que este código funcione?Cargar ensamblaje en AppDomain nuevo sin cargarlo en Parent AppDomain

string fileLocation = @"C:\Collector.dll"; 
AppDomain domain = AppDomain.CreateDomain(fileLocation); 
domain.Load(@"Services.Collector"); 
AppDomain.Unload(domain); 

Por cierto que también han probado este código sin suerte ya sea

string fileLocation = @"C:\Collector.dll"; 
byte[] assemblyFileBuffer = File.ReadAllBytes(fileLocation); 

AppDomainSetup domainSetup = new AppDomainSetup(); 
domainSetup.ApplicationBase = Environment.CurrentDirectory; 
domainSetup.ShadowCopyFiles = "true"; 
domainSetup.CachePath = Environment.CurrentDirectory; 
AppDomain tempAppDomain = AppDomain.CreateDomain("Services.Collector", AppDomain.CurrentDomain.Evidence, domainSetup); 

//Load up the temp assembly and do stuff 
Assembly projectAssembly = tempAppDomain.Load(assemblyFileBuffer); 

//Then I'm trying to clean up 
AppDomain.Unload(tempAppDomain); 
tempAppDomain = null; 
File.Delete(fileLocation); 

Respuesta

5

OK así que resolvió mi propio problema aquí. Aparentemente, si llamas a AppDomain.Load, lo registrará con tu AppDomain padre. Así que simplemente la respuesta es no hacer referencia a ella en absoluto. Este es el enlace a un sitio que muestra cómo configurarlo correctamente.

https://bookie.io/bmark/readable/9503538d6bab80

+1

Este enlace está muerto! – ZioN

+5

Por favor, puede proporcionar el código – ZioN

+0

nuevo enlace: https://bmark.us/bmark/readable/9503538d6bab80 – user1

4

Esto debería ser bastante fácil:

namespace Parent { 
    public class Constants 
    { 
    // adjust 
    public const string LIB_PATH = @"C:\Collector.dll"; 
    } 

    public interface ILoader 
    { 
    string Execute(); 
    } 

    public class Loader : MarshalByRefObject, ILoader 
    { 
    public string Execute() 
    { 
     var assembly = Assembly.LoadFile(Constants.LIB_PATH); 
     return assembly.FullName; 
    } 
    } 

    class Program 
    { 
    static void Main(string[] args) 
    { 
     var domain = AppDomain.CreateDomain("child"); 
     var loader = (ILoader)domain.CreateInstanceAndUnwrap(typeof(Loader).Assembly.FullName, typeof(Loader).FullName); 
     Console.Out.WriteLine(loader.Execute()); 
     AppDomain.Unload(domain); 
     File.Delete(Constants.LIB_PATH); 
    } 
    } 
} 
+0

No funciona. Obtengo una excepción de acceso no autorizado cuando intento eliminar el archivo. ¿Has probado tu código? –

+0

@WolfgangRoth - funciona para mí. si tienes un problema específico, te sugiero que hagas una nueva pregunta. –

+0

Resolví mi problema: de hecho, el depurador de Visual Studio se conecta al ensamblado durante la depuración y ya no se desconecta. Pero cuando corro sin depurador o cuando primero carga el archivo de ensamblaje en una matriz de bytes, todo funciona bien ... –

Cuestiones relacionadas