开源跨平台运行服务插件TaskCore.MainForm(4)

不安装sdk环境运行才是咋们需要关注的,下面就来看下怎么生成再ubuntu系统上能运行的文件;我们复制一份上面的TaskCore.MainForm01项目到TaskCore.MainForm02中来测试,由于之前我们在讲生成win7执行文件时候,执行了命令dotnet restore和dotnet publish -r win7-x64命令所以文件中有project.lock和bin文件夹,为了测试我们需要删除掉部分文件,只剩下如图文件,这里需要注意的是之前已经配置过project.xml我们无需在修改了:

开源跨平台运行服务插件TaskCore.MainForm

然后,分别执行和生成win7运行文件几乎相同的命令dotnet restore和dotnet publish -r ubuntu.16.04-x64不同之处在于生成的文件存放的位置不同和使用的运行环境不同,运行结果如图:

开源跨平台运行服务插件TaskCore.MainForm

publish文件夹中的文件就是在ubuntu系统执行的文件,然后我们需要把任务配置文件夹PluginXml和测试项目TaskCore.Test.dll复制到该目录中,再来咋们通过共享吧TaskCore.MainForm02目录中的publish复制到ubuntu中;然后我们需要把TaskCore.MainForm02可执行文件设置下权限,鼠标右键点击TaskCore.MainForm02可执行文件,选择“属性”,再选择“权限”选项卡,勾选“允许作为程序执行”,如图:

开源跨平台运行服务插件TaskCore.MainForm

然后,我们右键文件夹中空白处,选择“在终端打开”,再执行如下命令./TaskCore.MainForm02,最后看运行效果图:

开源跨平台运行服务插件TaskCore.MainForm

好了,发布在ubuntu系统上执行文件和运行的步奏就这些,几乎和win7上相同

. 框架代码解读及感悟

怎么使用跨平台TaskCore.MainForm任务框架讲解完了,下面来具体看下主要代码Program.cs文件中:

namespace TaskCore.MainForm { /// <summary> /// author 神牛步行3 /// contact 841202396@qq.com /// des TaskCore.MainForm跨平台插件由神牛步行3提供 /// </summary> public class Program { private static Dictionary<string, MoAssembly> dicTasks = new Dictionary<string, MoAssembly>(); public static void Main(string[] args) { //注册编码,防止乱码 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); //初始化程序集文件 _Init(); //是否继续开启任务,默认没有待执行任务,不提示 if (dicTasks.Count <= 0) { _LoopAlert("是否退出?(Y/N)"); return; } _LoopAlert("是否开始执行任务?(Y / N)"); //执行任务 foreach (var item in dicTasks.Values) { //使用Task防止异常后相互影响 Task.Run(() => { try { //创建任务对象 var tp = item.Asm.CreateInstance(item.FullName) as TPlugin; if (!string.IsNullOrEmpty(tp.XmlConfig.TpError)) { _Alert($"{DateTime.Now.ToString("yyyy/MM/dd HH:mm")}:{tp.XmlConfig.Name} - 异常信息:{tp.XmlConfig.TpError}"); } else { //timer定时器 var timer = new Timer((param) => { var msg = $"{DateTime.Now.ToString("yyyy/MM/dd HH:mm")}:{tp.XmlConfig.Name}"; try { var tpObj = param as TPlugin; //是否关闭暂停任务 if (tpObj.XmlConfig.CloseTask) { return; } _Alert($"{msg} - 开始执行...{tp.XmlConfig.Timer}分钟一次"); //任务入口 tpObj.TPlugin_Load(); } catch (Exception ex) { _Alert($"{msg} - 异常信息:{ex.Message}"); } }, tp, 0, 1000 * 60 * tp.XmlConfig.Timer); } } catch (Exception ex) { _Alert($"{DateTime.Now.ToString("yyyy/MM/dd HH:mm")}:{item.Name} - 异常信息:{ex.Message}"); } }); } _LoopAlert("正在监控执行的任务,是否退出?(Y / N)"); } /// <summary> /// 初始化程序集文件 /// </summary> private static void _Init() { try { _Alert("初始化任务中..."); //获取文件 var files = PublicClass._GetPluginFile(""); if (files.Length <= 0) { _Alert("未能找到可用的程序集,请检查配置"); return; } //读取任务文件 _Alert("读取CrossFiles.xml配置中..."); var baseAddr = Path.Combine(Directory.GetCurrentDirectory(), "PluginXml", "CrossFiles.xml"); var doc = XDocument.Load(baseAddr); var fileables = files.AsEnumerable(); var taskFiles = new List<FileInfo>(); foreach (var item in doc.Root.Nodes()) { var crossFile = item.ToString().ToUpper(); var choiceFiles = fileables.Where(b => crossFile.Contains(b.Name.ToUpper())); if (!choiceFiles.Any()) { continue; } taskFiles.AddRange(choiceFiles); } //展示文件信息 _Alert($"待遍历{taskFiles.Count}个文件信息..."); foreach (var item in taskFiles.OrderBy(b => b.CreationTime)) { var asmName = new AssemblyName($"{item.Name.Replace(".dll", "")}"); Assembly sm = Assembly.Load(asmName); if (sm == null) { continue; } var ts = sm.GetTypes(); //判断特定的任务类,加入任务dic foreach (var t in ts.Where(b => b.Name != "TPlugin" && b.GetMethod("TPlugin_Load") != null)) { dicTasks.Add( t.FullName, new MoAssembly { Asm = sm, FullName = t.FullName, Name = t.Name }); } } _Alert($"获取待执行任务量:{dicTasks.Count}个"); } catch (Exception ex) { _Alert($"异常信息:{ ex.Message}"); } } /// <summary> /// 消息提醒 /// </summary> /// <param>提示信息</param> /// <param>是否需要用户输入指令</param> /// <returns>用户录入的指令</returns> private static string _Alert(string msg = "神牛步行3-消息提醒", bool isReadLine = false) { Console.WriteLine(msg); if (isReadLine) { return Console.ReadLine(); } return ""; } private static void _LoopAlert(string msg = "是否开始执行任务?(Y/N)") { do { var readKey = _Alert(msg, true); if (readKey.ToUpper().Contains("Y")) { break; } } while (true); } } public class MoAssembly { public Assembly Asm { get; set; } public string FullName { get; set; } public string Name { get; set; } } }

TPlugin.cs文件中代码:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdpdzy.html