AppDomainsはアンロードされますが、leppieからの応答により、プラグインアセンブリがプライマリAppDomainとセカンダリAppDomainの両方にロードされているのかどうか疑問に思います。パフォーマンスカウンターを見ると、現在のAppDomainカウントが常に増加しているわけではありません。
アプリケーションは、セカンダリappDomainを作成してから、別のプラグインアセンブリをロードすることになっています。多分いくつかのコードが役立つでしょう:
プライマリappDomainからセカンダリAppDomainを作成します。
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を使用して、プラグインをセカンダリappDomainにロードします。
RemoteTaskRunner taskRunner = m_domain.CreateInstanceAndUnwrap(
Assembly.GetExecutingAssembly().FullName,
typeof (RemoteTaskRunner).FullName) as RemoteTaskRunner;
taskRunner.LoadTask(taskInfo.Assembly, taskInfo.Type);
RemoteTaskRunnerを使用して、セカンダリappDomainでタスクを実行します。
[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);
}
...
...
プラグインタスクを実行するために、プライマリappDomainで次のコード行が使用されます。
taskRunner.RunTask(taskInfo.TaskConfig);
タスクが終了すると、appDomainがアンロードされます。
AppDomain.Unload(m_domain);