/// <summary> /// 执行DLL任务 /// </summary> /// <param name="job"></param> private void InvokeDllJob(ManageJob job) { NotifyClientLog(job.Id, "================= DLL Running ================="); var stopwatch = new Stopwatch(); stopwatch.Start(); var types = job.Params.Select(p => typeof(string)).ToArray(); var @params = job.Params.ToArray(); _logger.Info($"Execute DLL Job:{job.Name}[{job.WorkPath}, {job.ClassName},{job.MethodName} ({string.Join(",", @params)})]"); var writer = new HlcTextWriter(); writer.WriteHandler += str => { NotifyClientLog(job.Id, str); }; var domainProxy = DynamicUtil.LoadDomain(job.WorkPath); domainProxy.SetOut(writer); var invokeDll = domainProxy.Invoke(job.ClassName, job.MethodName, types, @params); if (invokeDll != null) { NotifyClientLog(job.Id, $"DLL Result:{invokeDll.ToString()}"); } NotifyClientLog(job.Id, $"================= DLL Job Finished, Elapsed [{stopwatch.Elapsed:g}] ================="); }
/// <summary> /// 执行DLL服务 /// </summary> /// <param name="job"></param> private void InvokeDllServer(ManageJob job) { var types = job.Params.Select(p => typeof(string)).ToArray(); var @params = job.Params.ToArray(); var jobIndex = Jobs.FindIndex(j => j.Id.Equals(job.Id)); if (jobIndex < 0) { return; } Jobs[jobIndex].State = JobState.Normal; UpdateClientJob(Jobs[jobIndex]); AsyncUtil.Run(() => { Thread.Sleep(500); Jobs[jobIndex].State = JobState.Normal; Jobs[jobIndex].PreviousFireTime = DateTimeOffset.Now; UpdateClientJob(Jobs[jobIndex]); NotifyClientLog(job.Id, "================= DLL Server Running =================="); _logger.Info($"Execute DLL Server Job:{job.Name}[{job.WorkPath}, {job.ClassName},{job.MethodName} ({string.Join(",", @params)})]"); var writer = new HlcTextWriter(); writer.WriteHandler += str => { NotifyClientLog(job.Id, str); }; var domainProxy = DynamicUtil.LoadDomain(job.WorkPath); _domainDict[job.Id] = domainProxy; domainProxy.SetOut(writer); var result = domainProxy.Invoke(job.ClassName, job.MethodName, types, @params); if (result != null) { NotifyClientLog(job.Id, $"DLL Server Result:{result.ToString()}"); } }, () => { //NotifyClientLog(job.Id, "DLL Server 运行完了?? 完了???"); DynamicUtil.UnloadDomain(_domainDict[job.Id]); _domainDict.Remove(job.Id); Jobs[jobIndex].State = JobState.Complete; NotifyClientLog(job.Id, "================= DLL Server Finished =================="); UpdateClientJob(Jobs[jobIndex]); }, exception => { if (exception is AppDomainUnloadedException) { NotifyClientLog(job.Id, "================= DLL Server Uninstalled =================="); } else { _logger.Error(exception); NotifyClientLog(job.Id, "Server Error。" + exception.Message); Jobs[jobIndex].State = JobState.Error; DynamicUtil.UnloadDomain(_domainDict[job.Id]); _domainDict.Remove(job.Id); NotifyClientLog(job.Id, "================= DLL Server Error =================="); UpdateClientJob(Jobs[jobIndex]); } }); }