MacroExec.cs
上传用户:szltgg
上传日期:2019-05-16
资源大小:604k
文件大小:4k
源码类别:

Telnet服务器

开发平台:

C#

  1. /*
  2. * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3. * $Id: MacroExec.cs,v 1.2 2005/04/20 08:45:45 okajima Exp $
  4. */
  5. using System;
  6. using System.Threading;
  7. using System.Text;
  8. using System.Reflection;
  9. using System.Diagnostics;
  10. using Microsoft.JScript;
  11. using System.CodeDom.Compiler;
  12. using MacroEnvironment = Poderosa.Macro.Environment;
  13. namespace Poderosa.MacroEnv
  14. {
  15. internal class MacroUtil
  16. {
  17. public static Assembly LoadMacroAssembly(MacroModule mod) {
  18. if(mod.Type==MacroType.Assembly) {
  19. return Assembly.LoadFrom(mod.Path);
  20. }
  21. else if(mod.Type==MacroType.JavaScript) {
  22. ICodeCompiler compiler = new JScriptCodeProvider().CreateCompiler();
  23. CompilerParameters param = new CompilerParameters();
  24. param.CompilerOptions += "/debug";
  25. param.GenerateInMemory = true;
  26. param.GenerateExecutable = true;
  27. //param.ReferencedAssemblies.Add("mscorlib"); //梫傞偺丠
  28. param.ReferencedAssemblies.Add("System.Drawing.dll");
  29. param.ReferencedAssemblies.Add(GetMyExePath());
  30. param.ReferencedAssemblies.Add(GetGTerminalPath());
  31. foreach(string x in mod.AdditionalAssemblies)
  32. if(x.Length>0) param.ReferencedAssemblies.Add(x);
  33. CompilerResults result = compiler.CompileAssemblyFromFile(param, mod.Path);
  34. if(result.Errors.Count>0) {
  35. StringBuilder bld = new StringBuilder();
  36. bld.Append(GApp.Strings.GetString("Message.MacroExec.FailedToCompileScript"));
  37. foreach(CompilerError err in result.Errors) {
  38. bld.Append(String.Format("Line {0} Column {1} : {2}n", err.Line, err.Column, err.ErrorText));
  39. }
  40. throw new Exception(bld.ToString());
  41. }
  42. return result.CompiledAssembly;
  43. }
  44. else
  45. throw new Exception("Unsupported macro module type " + mod.Type.ToString() + " is specified.");
  46. }
  47. private static string GetMyExePath() {
  48. string t = typeof(MacroUtil).Assembly.CodeBase;
  49. int c1 = t.IndexOf(':'); //愭摢偼file://...偲偔傞
  50. int c2 = t.IndexOf(':', c1+1); //偙傟偑僪儔僀僽柤捈屻偺僐儘儞
  51. t = t.Substring(c2-1);
  52. return t.Replace('/', '\');
  53. }
  54. private static string GetGTerminalPath() {
  55. string t = typeof(GEnv).Assembly.CodeBase;
  56. int c1 = t.IndexOf(':'); //愭摢偼file://...偲偔傞
  57. int c2 = t.IndexOf(':', c1+1); //偙傟偑僪儔僀僽柤捈屻偺僐儘儞
  58. t = t.Substring(c2-1);
  59. return t.Replace('/', '\');
  60. }
  61. }
  62. internal class MacroExecutor {
  63. private MacroModule _module;
  64. private MethodInfo _entryPoint;
  65. private MacroTraceWindow _traceWindow;
  66. private Thread _macroThread;
  67. public MacroExecutor(MacroModule mod, MethodInfo ep) {
  68. _module = mod;
  69. _entryPoint = ep;
  70. if(mod.DebugMode) {
  71. _traceWindow = new MacroTraceWindow();
  72. _traceWindow.AdjustTitle(mod);
  73. _traceWindow.Owner = GApp.Frame;
  74. _traceWindow.Show();
  75. }
  76. }
  77. public MacroModule Module {
  78. get {
  79. return _module;
  80. }
  81. }
  82. public void AsyncExec() {
  83. _macroThread = new Thread(new ThreadStart(MacroMain));
  84. _macroThread.Start();
  85. }
  86. private void MacroMain() {
  87. try {
  88. InitEnv();
  89. _entryPoint.Invoke(null, new object[1] { new string[0] });
  90. }
  91. catch(TargetInvocationException tex) {
  92. Exception inner = tex.InnerException;
  93. if(_traceWindow==null) {
  94. GApp.InterThreadUIService.Warning(String.Format(GApp.Strings.GetString("Message.MacroExec.ExceptionWithoutTraceWindow"), inner.Message));
  95. Debug.WriteLine("TargetInvocationException");
  96. Debug.WriteLine(inner.GetType().Name);
  97. Debug.WriteLine(inner.Message);
  98. Debug.WriteLine(inner.StackTrace);
  99. }
  100. else {
  101. _traceWindow.AddLine(GApp.Strings.GetString("Message.MacroExec.ExceptionInMacro"));
  102. _traceWindow.AddLine(String.Format("{0} : {1}", inner.GetType().FullName, inner.Message));
  103. _traceWindow.AddLine(inner.StackTrace);
  104. }
  105. }
  106. catch(Exception ex) {
  107. Debug.WriteLine(ex.Message);
  108. Debug.WriteLine(ex.StackTrace);
  109. }
  110. finally {
  111. GApp.InterThreadUIService.MacroFinished();
  112. }
  113. }
  114. private void InitEnv() {
  115. MacroEnvironment.Init(new ConnectionListImpl(), new UtilImpl(), new FrameImpl(), new DebugServiceImpl(_traceWindow));
  116. }
  117. public void Abort() {
  118. _macroThread.Abort();
  119. }
  120. }
  121. }