Example #1
0
 public void OnChange(string virtualPath)
 {
     lock (_syncObject)
     {
         try
         {
             var coder = XPCCoder.Create(virtualPath);
             if (coder == null)
             {
                 return;
             }
             coder.Generate();
             XPCAssembly.Delete(coder.VirtualPath);//删除程序集
         }
         catch (Exception ex)
         {
             throw ex;
         }
         finally
         {
             //清空缓存
             XamlUtil.RecoverMemory();
         }
     }
 }
Example #2
0
        internal static void Generate(string virtualPath)
        {
            XPCCoder coder = XPCCoder.Create(virtualPath);

            if (coder == null)
            {
                return;
            }
            coder.Generate();//生成代码
            if (!IsIgnore(coder))
            {
                if (WriteCode(coder) || !XPCAssembly.Exists(coder))
                {
                    try
                    {
                        //重新生成程序集
                        XPCAssembly.Compile(coder);
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }
            }
        }
        /// <summary>
        /// 编译程序集
        /// </summary>
        /// <param name="coder"></param>
        public static void Compile(XPCCoder coder)
        {
            var assemblyFileName = _getAssemblyFileName(coder.VirtualPath);

            DeleteAssembly(assemblyFileName);
            CodeCompiler.CompileCSharp(assemblyFileName, coder.UserPath, coder.GIPath, coder.GPath);
        }
Example #4
0
        /// <summary>
        /// 保存代码文件,如果成功保存,返回true,这意味着代码被更改
        /// </summary>
        /// <param name="coder"></param>
        /// <returns></returns>
        private static bool WriteCode(XPCCoder coder)
        {
            int count = 0;

            if (WriteCode(coder.UserPath, coder.UserCode))
            {
                count++;
            }
            if (WriteCode(coder.GPath, coder.GCode))
            {
                count++;
            }
            if (WriteCode(coder.GIPath, coder.GICode))
            {
                count++;
            }
            return(count > 0);
        }
        /// <summary>
        /// 获得xaml页面组件的类型
        /// 所谓xaml页面组件,指的是站点自己创建的,与某个xaml页面相关的组件
        /// 该组件一般会基于一个xaml组件做扩展
        /// </summary>
        /// <returns></returns>
        private static Type GetXamlPageComponentType(HtmlNode node, string virtualPath)
        {
            var className = node.GetAttributeValue("x:Class", XPCCoder.GetClassName(virtualPath));

            //var className = XPCCoder.GetClassName(virtualPath);
            if (string.IsNullOrEmpty(className))
            {
                return(null);
            }
            if (className.IndexOf(".") == -1)
            {
                className = string.Format("App_Code.{0}", className);                               //没有指定命名空间,那么默认为App_Code的命名空间
            }
            var assembly = XPCAssembly.Load(virtualPath);

            if (assembly == null)
            {
                return(null);
            }
            return(assembly.GetType(className, false, true));
            //className = string.Format("{0},{1}", className, XPCCoder.App_CodeAssemblyName);
            //return Type.GetType(className, false, true);
        }
Example #6
0
 private static bool IsIgnore(XPCCoder coder)
 {
     return(!File.Exists(coder.UserPath) || !File.Exists(coder.GPath) || !File.Exists(coder.GIPath));
 }
        public static bool Exists(XPCCoder coder)
        {
            var assemblyFileName = _getAssemblyFileName(coder.VirtualPath);

            return(File.Exists(assemblyFileName));
        }