AppDomains được tải xuống, nhưng phản hồi từ leppie, làm tôi băn khoăn liệu các hội đồng plugin có đang được tải vào cả AppDomain chính và AppDomain phụ hay không. Khi tôi nhìn vào các quầy hiệu suất, số lượng AppDomain hiện tại không liên tục tăng lên.
Ứng dụng được cho là tạo Miền phụ appDomain rồi tải một trình cắm plugin riêng biệt. Có lẽ một số mã sẽ giúp:
Tạo AppDomain thứ cấp từ AppDomain chính:
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);
Sử dụng RemoteTaskRunner để nạp plugin trong AppDomain thứ:
RemoteTaskRunner taskRunner = m_domain.CreateInstanceAndUnwrap(
Assembly.GetExecutingAssembly().FullName,
typeof (RemoteTaskRunner).FullName) as RemoteTaskRunner;
taskRunner.LoadTask(taskInfo.Assembly, taskInfo.Type);
Sử dụng RemoteTaskRunner để Execute công việc trong ứng dụng phụDomain:
[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);
}
...
...
To thực hiện nhiệm vụ plugin, các dòng mã sau đây được sử dụng trong AppDomain chính:
taskRunner.RunTask(taskInfo.TaskConfig);
Sau khi kết thúc nhiệm vụ, AppDomain được bốc dỡ:
AppDomain.Unload(m_domain);
Bạn có phá hủy AppDomain mới mỗi lần sau khi sử dụng không? –
Có, AppDomain.Unload được gọi. Ngoài ra, các bộ đếm hiệu suất cho AppDomains không liên tục tăng lên. –