第二篇 基於.net搭建熱插拔式web框架(沙箱的構建)
阿新 • • 發佈:2018-12-29
/// <summary>沙箱管道 /// </summary> public class SandBoxChannel : MarshalByRefObject { /// <summary>沙箱內載入的程式集 /// </summary> private Assembly _assembly; /// <summary>載入程式集 /// </summary> /// <param name="assemblyFile">程式集檔案路徑(主程式類庫路徑,依賴類庫自動載入)</param> public void LoadAssembly(string assemblyFile) { try { _assembly = Assembly.LoadFrom(assemblyFile); } catch (Exception ex) { throw ex; } } /// <summary>沙箱內方法呼叫 /// </summary> /// <param name="typeName">類名稱(全名稱)</param> /// <param name="methodName">方法名稱</param> /// <param name="args">引數</param> /// <returns></returns> public object InvokeMothod(string typeName, string methodName, params object[] args) { var _assembly_temp = _assembly; if (_assembly_temp == null) return null; if (typeName == "Huber.Kernel.Entity.CurVariable" && methodName == "SetCurWebDir") {//設定當前沙箱內的系統變數,非外部方法 foreach (var a in AppDomain.CurrentDomain.GetAssemblies()) { if (a.GetName().Name == "Huber.Kernel") { _assembly_temp = a; break; } } } Type tp = _assembly_temp.GetType(typeName, true, false); if (tp == null) return null; MethodInfo method = tp.GetMethod(methodName); if (method == null) return null; Object obj = Activator.CreateInstance(tp); //ContentResult //FileContentResult //FileStreamResult //FilePathResult //HttpNotFoundResult //JavaScriptResult //JsonResult //PartialViewResult //RedirectToRouteResult //RedirectResult //ViewResult object result = method.Invoke(obj, args); return result; } /// <summary>獲取所有的action /// </summary> /// <returns></returns> public Dictionary<string, CAModel> GetAllAction() { Dictionary<string, CAModel> result = null; Type[] types = _assembly.GetTypes(); MethodInfo[] meths = null; string controller = string.Empty; if (types != null) { result = new Dictionary<string, CAModel>(); string url = string.Empty; CAModel temp; foreach (var t in types) { if (t.BaseType != null && t.BaseType.ToString() == "Huber.Kernel.MVC.HuberController") { meths = t.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); foreach (var m in meths) { temp = new CAModel(t.ToString(), m.Name); result.Add(temp.UrlPath.ToLower(), temp); } } } } return result; } public override object InitializeLifetimeService() { //Remoting物件 無限生存期 return null; }