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