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);
        }
Exemple #2
0
        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));
        }
Exemple #3
0
        /// <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());
        }