Los AppDomains están descargados, pero la respuesta de leppie hace que me pregunte si los plugin-assemblies se están cargando tanto en el AppDomain primario como en el AppDomain secundario. Cuando miro los contadores de rendimiento, el recuento actual de AppDomain no aumenta constantemente.
Se supone que la aplicación debe crear unDominio de aplicación secundario y luego cargar un ensamblaje de complemento por separado. Tal vez algo de código ayudaría:
Creación del dominio de aplicación secundaria del dominio de aplicación principal:
AppDomainSetup ads = new AppDomainSetup();
ads.ApplicationName = "RemoteAgentLib";
ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
ads.PrivateBinPath = AppDomain.CurrentDomain.BaseDirectory;
ads.ShadowCopyDirectories = AppDomain.CurrentDomain.BaseDirectory;
ads.ShadowCopyFiles = "true";
m_domain = AppDomain.CreateDomain("RemoteTaskRunner", null, ads);
Utilice la RemoteTaskRunner para cargar el plug-in en el dominio de aplicación secundaria:
RemoteTaskRunner taskRunner = m_domain.CreateInstanceAndUnwrap(
Assembly.GetExecutingAssembly().FullName,
typeof (RemoteTaskRunner).FullName) as RemoteTaskRunner;
taskRunner.LoadTask(taskInfo.Assembly, taskInfo.Type);
Uso del RemoteTaskRunner a Ejecutar la tarea en el appDomain secundario:
[Serializable]
internal class RemoteTaskRunner : MarshalByRefObject
{
private ITask m_task;
public RemoteTaskRunner()
{
}
internal void LoadTask(string assembly, string type)
{
// This assembly should load in the secondary appDomain.
Assembly taskAssembly = AppDomain.CurrentDomain.Load(assembly);
m_task = taskAssembly.CreateInstance(type) as ITask;
}
internal void RunTask(string taskConfig)
{
// This method should run in the secondary appDomain.
m_task.RunTask(taskConfig, m_logger);
}
...
...
Para ejecutar la tarea plugin, la siguiente línea de código se utiliza en el dominio de aplicación principal:
taskRunner.RunTask(taskInfo.TaskConfig);
Después de que finalice la tarea, el dominio de aplicación se descarga:
AppDomain.Unload(m_domain);
¿Estás destruyendo el nuevo AppDomain cada vez que lo usas? –
Sí, se llama AppDomain.Unload. Además, los contadores de rendimiento para AppDomains no aumentan constantemente. –