1. 程式人生 > >第二篇 基於.net搭建熱插拔式web框架(沙箱的構建)

第二篇 基於.net搭建熱插拔式web框架(沙箱的構建)

/// <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;
        }