新生命码神工具,代码生成、网络工具、API工具、串口工具、正则工具、图标工具、加解密工具、地图接口。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

202 lines
6.5 KiB

12 years ago
12 years ago
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Reflection;
  5. using System.Windows.Forms;
  6. using NewLife;
  7. using NewLife.Log;
  8. using NewLife.Net;
  9. using NewLife.Threading;
  10. using NewLife.Xml;
  11. using XCode.DataAccessLayer;
  12. namespace XCoder
  13. {
  14. static class Program
  15. {
  16. /// <summary>应用程序的主入口点。</summary>
  17. [STAThread]
  18. static void Main()
  19. {
  20. XTrace.UseWinForm();
  21. // 参数启动
  22. var args = Environment.GetCommandLineArgs();
  23. if (args != null && args.Length > 1)
  24. {
  25. try
  26. {
  27. StartWithParameter(args);
  28. }
  29. catch (Exception ex)
  30. {
  31. XTrace.WriteException(ex);
  32. }
  33. return;
  34. }
  35. try
  36. {
  37. Update(true);
  38. new TimerX(s => Runtime.ReleaseMemory(), null, 5000, 10000);
  39. }
  40. catch (Exception ex)
  41. {
  42. XTrace.WriteException(ex);
  43. }
  44. Application.EnableVisualStyles();
  45. Application.SetCompatibleTextRenderingDefault(false);
  46. Application.Run(new FrmMDI());
  47. // 此时执行自动更新
  48. var up = _upgrade;
  49. if (up != null)
  50. {
  51. _upgrade = null;
  52. up.Update();
  53. }
  54. }
  55. /// <summary>参数启动</summary>
  56. static void StartWithParameter(String[] args)
  57. {
  58. var dic = new Dictionary<String, String>(StringComparer.OrdinalIgnoreCase);
  59. for (int i = 2; i < args.Length - 1; i++)
  60. {
  61. switch (args[i].ToLower())
  62. {
  63. case "-config":
  64. case "-model":
  65. case "-connstr":
  66. case "-provider":
  67. case "-log":
  68. dic.Add(args[i].Substring(1), args[++i].Trim('\"'));
  69. break;
  70. default:
  71. break;
  72. }
  73. }
  74. // 转移日志
  75. var logfile = "";
  76. if (dic.TryGetValue("Log", out logfile) && !logfile.IsNullOrWhiteSpace())
  77. {
  78. #if DEBUG
  79. XTrace.WriteLine("准备切换日志到 {0}", logfile);
  80. #endif
  81. try
  82. {
  83. var log = TextFileLog.CreateFile(logfile);
  84. log.Info("XCoder.exe {0}", String.Join(" ", args));
  85. XTrace.Log = log;
  86. }
  87. catch (Exception ex) { XTrace.WriteException(ex); }
  88. }
  89. switch (args[1].ToLower())
  90. {
  91. case "-render":
  92. Render(dic["Model"], dic["Config"]);
  93. return;
  94. case "-makemodel":
  95. MakeModel(dic["Model"], dic["ConnStr"], dic["Provider"]);
  96. return;
  97. case "-update":
  98. Update(false);
  99. return;
  100. default:
  101. break;
  102. }
  103. }
  104. static Upgrade _upgrade;
  105. static void Update(Boolean isAsync)
  106. {
  107. if (!isAsync) XTrace.WriteLine("自动更新!");
  108. if (XConfig.Current.LastUpdate.Date < DateTime.Now.Date)
  109. {
  110. XConfig.Current.LastUpdate = DateTime.Now;
  111. var root = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
  112. var up = new Upgrade();
  113. if (XConfig.Current.Debug) up.Log = XTrace.Log;
  114. up.Name = "XCoder";
  115. up.Server = "http://www.newlifex.com/showtopic-260.aspx";
  116. up.UpdatePath = root.CombinePath(up.UpdatePath);
  117. if (up.Check())
  118. {
  119. up.Download();
  120. if (!isAsync)
  121. up.Update();
  122. else
  123. // 留到执行完成以后自动更新
  124. _upgrade = up;
  125. }
  126. }
  127. if (isAsync)
  128. {
  129. // 释放T4模版
  130. var b = File.Exists("XCoder.tt");
  131. var txt = Source.GetText("XCoder.tt");
  132. txt = txt.Replace("{XCoderPath}", AppDomain.CurrentDomain.BaseDirectory);
  133. File.WriteAllText("XCoder.tt", txt);
  134. //if (!b) MessageBox.Show("新版本增加XCoder.tt,拷贝到类库项目里面。\r\nVS中修改文件内参数,右键执行自定义工具!", "提示");
  135. }
  136. }
  137. static void Render(String mdl, String cfg)
  138. {
  139. XTrace.WriteLine("生成代码:模型{0} 配置{1}", mdl, cfg);
  140. var config = cfg.ToXmlFileEntity<XConfig>();
  141. XTrace.WriteLine("模版:{0}", config.TemplateName);
  142. XTrace.WriteLine("输出:{0}", config.OutputPath);
  143. var xml = File.ReadAllText(mdl);
  144. var tables = DAL.Import(xml);
  145. var engine = new Engine(config);
  146. engine.Tables = tables;
  147. foreach (var item in tables)
  148. {
  149. XTrace.WriteLine("生成:{0}", item);
  150. engine.Render(item);
  151. }
  152. // 重新整理模型
  153. Int32 i = 0;
  154. foreach (var item in tables)
  155. {
  156. item.ID = ++i;
  157. Int32 j = 0;
  158. foreach (var dc in item.Columns)
  159. {
  160. dc.ID = ++j;
  161. }
  162. }
  163. // 如果有改变,才重新写入模型文件
  164. var xml2 = DAL.Export(tables);
  165. if (xml2 != xml) File.WriteAllText(mdl, xml2);
  166. }
  167. static void MakeModel(String mdl, String connstr, String provider)
  168. {
  169. XTrace.WriteLine("导出模型:ConnStr={0} Provider={1} Model={2}", connstr, provider, mdl);
  170. var key = "XCoder_Temp";
  171. DAL.AddConnStr(key, connstr, null, provider);
  172. var list = DAL.Create(key).Tables;
  173. var xml = DAL.Export(list);
  174. var dir = Path.GetDirectoryName(mdl);
  175. if (!String.IsNullOrEmpty(dir) && !Directory.Exists(dir)) Directory.CreateDirectory(dir);
  176. File.WriteAllText(mdl, xml);
  177. }
  178. }
  179. }