AppDomain 已卸载,但来自 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);
}
...
...
要执行插件任务,在 Primary appDomain 中使用以下代码行:
taskRunner.RunTask(taskInfo.TaskConfig);
任务完成后,appDomain 被卸载:
AppDomain.Unload(m_domain);