public void TestRefAssembliesChange() { TemplateInfo ti = Cache.CompileTemplate(@"<template></template>", Globals, RefAssemblies); string hash1 = ti.TemplateKey; RefAssemblies.Clear(); ti = Cache.CompileTemplate(@"<template></template>", Globals, RefAssemblies); string hash2 = ti.TemplateKey; Assert.AreNotEqual(hash1, hash2, "Template re-generation if referenced assemblies change failed. Hash1: {0}, Hash2: {1}", hash1, hash2); }
Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { if (args.RequestingAssembly == null || args.RequestingAssembly != MacroAssembly) { return(null); } var fullName = new AssemblyName(args.Name); var assemblyPath = RefAssemblies .Where(x => Path.GetFileNameWithoutExtension(x).Equals(fullName.Name, IGNORE_CASE)) .FirstOrDefault(); if (string.IsNullOrEmpty(assemblyPath)) { return(null); } if (!File.Exists(assemblyPath)) { return(null); } return(Assembly.LoadFrom(assemblyPath)); }
/// <summary> /// Generate and compile C# class for macro /// </summary> /// <returns></returns> bool CompileClass() { if (!GenerateClass()) { return(false); } var dllUri = new Uri(Assembly.GetExecutingAssembly().EscapedCodeBase); var dllPath = Uri.UnescapeDataString(dllUri.AbsolutePath); var macroDllPath = Path.Combine(Path.GetDirectoryName(dllPath), Name + ".dll"); if (File.Exists(macroDllPath)) { File.Delete(macroDllPath); } var cscParams = new CompilerParameters() { GenerateInMemory = false, OutputAssembly = macroDllPath }; cscParams.ReferencedAssemblies.AddRange(RefAssemblies.ToArray()); var cSharpProvider = new CSharpCodeProvider(); CompilerResults = cSharpProvider.CompileAssemblyFromSource(cscParams, CSharpClassCode); if (CompilerResults.Errors.Count > 0) { if (File.Exists(macroDllPath)) { File.Delete(macroDllPath); } return(ErrorMsg(string.Join("\r\n", CompilerResults.Errors.Cast <CompilerError>() .Select(x => x.ErrorText)))); } MacroAssembly = AppDomain.CurrentDomain.Load(File.ReadAllBytes(macroDllPath)); MacroClass = MacroAssembly.GetType(string.Format("QtVsTest.Macros.{0}", Name)); AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; if (File.Exists(macroDllPath)) { File.Delete(macroDllPath); } foreach (var serviceVar in ServiceRefs.Values) { serviceVar.RefVar = MacroClass.GetField(serviceVar.Name, PUBLIC_STATIC); var serviceType = MacroClass.GetField(SERVICETYPE_PREFIX + serviceVar.Name, PUBLIC_STATIC); serviceVar.ServiceType = (Type)serviceType.GetValue(null); } ResultField = MacroClass.GetField("Result", PUBLIC_STATIC); foreach (var globalVar in GlobalVars.Values) { globalVar.FieldInfo = MacroClass.GetField(globalVar.Name, PUBLIC_STATIC); if (!globalVar.IsCallOutput) { globalVar.InitInfo = MacroClass .GetProperty(INIT_PREFIX + globalVar.Name, PUBLIC_STATIC); } } Run = (Func <Task>)Delegate.CreateDelegate(typeof(Func <Task>), MacroClass.GetMethod(MethodName, PUBLIC_STATIC)); MacroClass.GetField("GetAssembly", PUBLIC_STATIC) .SetValue(null, new Func <string, Assembly>(GetAssembly)); MacroClass.GetField("SwitchToUIThread", PUBLIC_STATIC) .SetValue(null, new Func <Task>(SwitchToUIThreadAsync)); MacroClass.GetField("SwitchToWorkerThread", PUBLIC_STATIC) .SetValue(null, new Func <Task>(SwitchToWorkerThreadAsync)); MacroClass.GetField("CallMacro", PUBLIC_STATIC) .SetValue(null, new Func <string, Task>(CallMacroAsync)); MacroClass.GetField("WaitExpr", PUBLIC_STATIC) .SetValue(null, new Func <int, Func <object>, Task>(WaitExprAsync)); if (!InitializeUiGlobals()) { return(false); } return(NoError()); }