Домены приложений выгружены, но ответ от leppie заставляет задуматься, загружаются ли сборки плагинов как в основной домен приложений, так и в дополнительный домен приложений. Когда я смотрю на счетчики производительности, текущий счетчик доменов приложений не постоянно увеличивается.
Приложение должно создать вторичный домен приложения, а затем загрузить отдельную сборку плагина. Может быть, какой-то код поможет:
Создание вторичного домена приложений из первичного домена приложений:
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);
Используйте RemoteTaskRunner для загрузки плагина во вторичном домене приложения:
RemoteTaskRunner taskRunner = m_domain.CreateInstanceAndUnwrap(
Assembly.GetExecutingAssembly().FullName,
typeof (RemoteTaskRunner).FullName) as RemoteTaskRunner;
taskRunner.LoadTask(taskInfo.Assembly, taskInfo.Type);
Используйте RemoteTaskRunner для выполнения задачи во вторичном домене приложения:
[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);
}
...
...
Для выполнения задачи плагина в основном домене приложения используется следующая строка кода:
taskRunner.RunTask(taskInfo.TaskConfig);
После завершения задачи домен приложения выгружается:
AppDomain.Unload(m_domain);