¿Cómo descargar un ensamblado desde el dominio de aplicación principal?

Me gustaría saber cómo descargar un ensamblaje que se carga en el AppDomain principal.

Tengo el siguiente código:

var assembly = Assembly.LoadFrom( FilePathHere ); 

Necesito / quiero ser capaz de descargar este ensamblaje cuando haya terminado.

Gracias por tu ayuda.

No puede descargar un ensamblado de un dominio de aplicación. Puede destruir appdomains, pero una vez que se carga un ensamblado en un dominio de aplicación, permanece allí durante la vigencia del dominio de la aplicación.

Consulte la explicación de Jason Zander sobre ¿Por qué no hay una Asamblea? ¿Método de descarga?

Si está utilizando 3.5, puede usar AddIn Framework para facilitar la administración / llamada a diferentes AppDomains (que puede descargar, descargar todos los ensambles). Si está utilizando versiones anteriores, debe crear un nuevo dominio de aplicación para descargarlo.

También sé que esto es muy antiguo, ¡pero puede ayudar a alguien que está teniendo este problema! ¡Aquí hay una manera que he encontrado para hacerlo! En lugar de usar:

 var assembly = Assembly.LoadFrom( FilePathHere ); 

utilizar esta:

 var assembly = Assembly.Load( File.ReadAllBytes(FilePathHere)); 

De hecho, esto carga el “Contenido” del archivo de ensamblaje, en lugar del archivo en sí. ¡Lo que significa que NO hay un locking de archivos en el archivo de ensamblaje! ¡Ahora puede copiarse, eliminarse o actualizarse sin cerrar su aplicación o tratar de usar un AppDomain o Marshaling por separado!

PROS: ¡ Muy simple de arreglar con un 1 Liner de código! CONS: No se puede usar AppDomain, Assembly.Location o Assembly.CodeBase.

Ahora solo necesita destruir cualquier instancia creada en el ensamblado. Por ejemplo:

 assembly = null; 

No puede descargar un ensamblaje sin descargar todo el dominio de la aplicación. He aquí por qué :

  1. Está ejecutando ese código en el dominio de la aplicación. Eso significa que hay posibles sitios de llamadas y stacks de llamadas con direcciones en ellos que esperan seguir trabajando.

  2. Digamos que logró hacer un seguimiento de todos los identificadores y referencias al código que ya estaba ejecutándose en un ensamblado. Suponiendo que no haya introducido el código, una vez que haya liberado satisfactoriamente el conjunto, solo habrá liberado los metadatos e IL. El código JIT aún se asigna en el montón del cargador de dominio de la aplicación (los métodos JIT se asignan secuencialmente en un búfer en el orden en el que se llaman).

  3. El último problema se relaciona con el código que se ha cargado compartido, que de otro modo se conocería más formalmente como “dominio neutral” (check out / shared en la herramienta ngen). En este modo, el código para un ensamblado se genera para ser ejecutado desde cualquier dominio de aplicación (nada conectado).

Se recomienda que diseñe su aplicación alrededor del límite del dominio de la aplicación de forma natural, donde la descarga es totalmente compatible.

Debe cargar sus ensambles temporales en otro AppDomain y, cuando no esté en uso, puede descargar ese AppDomain . Es seguro y rápido

Si desea tener un código temporal que pueda descargarse posteriormente, dependiendo de sus necesidades, la clase DynamicMethod puede hacer lo que quiera. Sin embargo, eso no te da clases.

Aquí hay un BUEN ejemplo de cómo comstackr y ejecutar dll durante el tiempo de ejecución y luego descargar todos los recursos: http://www.west-wind.com/presentations/dynamicCode/DynamicCode.htm

Sé que es viejo, pero podría ayudar a alguien. Puede cargar el archivo de la transmisión y liberarlo. Funcionó para mí Encontré la solución AQUÍ .

Espero eso ayude.

Como alternativa, si el ensamblado se acaba de cargar en primer lugar, para verificar la información del ensamblado como publicKey, la mejor manera sería no cargarlo, y más bien verificar la información cargando solo el AssemblyName al principio:

 AssemblyName an = AssemblyName.GetAssemblyName ("myfile.exe"); byte[] publicKey = an.GetPublicKey(); CultureInfo culture = an.CultureInfo; Version version = an.Version; 

EDITAR

Si necesita reflejar los tipos en el ensamblado sin tener el ensamblado en el dominio de su aplicación, puede usar el método Assembly.ReflectionOnlyLoadFrom . esto le permitirá observar los tipos en el ensamblado pero no le permitirá crear una instancia de ellos, y tampoco cargará el ensamblado en el Dominio de la aplicación.

Mira este ejemplo como exlanation

 public void AssemblyLoadTest(string assemblyToLoad) { var initialAppDomainAssemblyCount = AppDomain.CurrentDomain.GetAssemblies().Count(); //4 Assembly.ReflectionOnlyLoad(assemblyToLoad); var reflectionOnlyAppDomainAssemblyCount = AppDomain.CurrentDomain.GetAssemblies().Count(); //4 //Shows that assembly is NOT loaded in to AppDomain with Assembly.ReflectionOnlyLoad Assert.AreEqual(initialAppDomainAssemblyCount, reflectionOnlyAppDomainAssemblyCount); // 4 == 4 Assembly.Load(assemblyToLoad); var loadAppDomainAssemblyCount = AppDomain.CurrentDomain.GetAssemblies().Count(); //5 //Shows that assembly is loaded in to AppDomain with Assembly.Load Assert.AreNotEqual(initialAppDomainAssemblyCount, loadAppDomainAssemblyCount); // 4 != 5 }