Esempio n. 1
0
        /*
         * static Assembly domain_AssemblyResolve(object sender, ResolveEventArgs args) {
         * string asmName = args.Name.Split(',')[0];
         * var root = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
         * string adapterPath = root + "\\Adapters\\";
         *
         * foreach( var dir in Directory.GetDirectories(adapterPath) ) {
         *  var fn = Path.Combine(dir, asmName + ".dll");
         *  if( File.Exists(fn) && AssemblyName.GetAssemblyName(fn).FullName == args.Name )
         *    return Assembly.LoadFrom(fn);
         * }
         *
         * return null;
         * }
         */

        internal static IServiceBusDiscovery CreateDiscovery(string name, string version, string transportation)
        {
            try {
                foreach (var asm in AsmCache.Assemblies)
                {
                    var type = asm.Types.SingleOrDefault(t =>
                                                         t.ServiceBusName == name &&
                                                         t.ServiceBusVersion == version &&
                                                         t.MessageQueueType == transportation &&
                                                         t.Interfaces.Any(i => i.EndsWith("IServiceBusDiscovery")));

                    if (type != null)
                    {
                        return((IServiceBusDiscovery)Activator.CreateInstance(asm.AssemblyName, type.TypeName).Unwrap());
                    }
                }
            } catch (TypeLoadException) {
                AsmCache.Rescan();

                CreateDiscovery(name, version, transportation);
            }


            throw new NoMessageBusManagerFound(name, transportation);
        }
Esempio n. 2
0
        internal static string GetManagerFilePath(string name, string version, string queueType)
        {
            try {
                if (!AsmCache.Scanning)
                {
                    foreach (var asm in AsmCache.Assemblies)
                    {
                        var type = asm.Types.SingleOrDefault(t =>
                                                             t.ServiceBusName == name &&
                                                             t.ServiceBusVersion == version &&
                                                             t.MessageQueueType == queueType &&
                                                             t.Interfaces.Any(i => i.EndsWith("IServiceBusManager")));

                        if (type != null)
                        {
                            return(asm.AssemblyFile);
                        }
                    }
                }
                else
                {
                    return(string.Empty);
                }
            } catch (TypeLoadException) {
                AsmCache.Rescan();

                return(GetManagerFilePath(name, version, queueType));
            }


            throw new NoMessageBusManagerFound(name, queueType);
        }
Esempio n. 3
0
        //static Dictionary<string, AppDomain> _domains = new Dictionary<string, AppDomain>();

        internal static IServiceBusManager CreateManager(string name, string version, string queueType)
        {
            // DH 2013-10-15: Using Separate AppDomain per Manager (version) is To Slow due all Marheling

            /*
             * var domainName = name + queueType;
             * var domain = _domains.GetValue(domainName, null);
             * if( domain == null ) {
             * domain = AppDomain.CreateDomain(domainName);
             * domain.AssemblyResolve += domain_AssemblyResolve;
             * _domains.Add(domainName, domain);
             * }
             */

            try {
                foreach (var asm in AsmCache.Assemblies)
                {
                    var type = asm.Types.SingleOrDefault(t =>
                                                         t.ServiceBusName == name &&
                                                         t.ServiceBusVersion == version &&
                                                         t.MessageQueueType == queueType &&
                                                         t.Interfaces.Any(i => i.EndsWith("IServiceBusManager")));

                    if (type != null)
                    {
                        return((IServiceBusManager)Activator.CreateInstance(asm.AssemblyName, type.TypeName).Unwrap());
                    }
                    //return (IServiceBusManager)domain.CreateInstanceAndUnwrap(asm.AssemblyName, type.TypeName);
                }
            } catch (TypeLoadException) {
                AsmCache.Rescan();

                CreateManager(name, version, queueType);
            }


            throw new NoMessageBusManagerFound(name, queueType);
        }
Esempio n. 4
0
        /// <summary>
        /// Finds Python mods and adds them to ReflectMan's Types list.
        /// </summary>
        public static void Scan()
        {
            try
            {
                if (scanned)
                {
                    throw new Exception("PythonAPI.Scan() called multiple times");
                }
                scopes = new Dictionary <string, ScriptScope>();
                var resman   = new System.Resources.ResourceManager("Plex.Engine.Properties.Resources", typeof(Properties.Resources).Assembly);
                var provider = new CSharpCodeProvider();
                var refs     = AppDomain.CurrentDomain.GetAssemblies().Select(f => f.Location).Concat(new string[] { "Microsoft.CSharp.dll" }).ToArray();
                var types    = new List <Type>();
                var sha      = new SHA512Managed();
                var oldcache = new Dictionary <string, AsmCacheEntry>();
                var newcache = new Dictionary <string, AsmCacheEntry>();
                if (File.Exists("pyasmcache.dat"))
                {
                    using (var stream = File.OpenRead("pyasmcache.dat"))
                        try
                        {
                            oldcache = AsmCache.Load(stream);
                        }
                        catch (Exception ex)
                        {
#if DEBUG
                            Console.WriteLine("[dev] Failed to read the assembly cache.");
                            Console.WriteLine(ex.ToString());
#endif
                        }
                }
                foreach (var fname in Directory.GetFiles(Environment.CurrentDirectory, "*.py").Select(Path.GetFileName))
                {
                    byte[] checksum;
                    using (FileStream stream = File.OpenRead(fname))
                        checksum = sha.ComputeHash(stream);
                    var script = File.ReadAllText(fname);
                    try
                    {
                        scopes[fname] = PythonHelper.RunCode(script);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("[dev] Failed to execute Python script " + fname);
                        Console.WriteLine(ex.ToString());
                        continue;
                    }
                    if (oldcache.ContainsKey(fname))
                    {
                        var oldentry = oldcache[fname];
                        if (checksum.SequenceEqual(oldentry.checksum))
                        {
                            try
                            {
                                foreach (var asm in oldentry.asms)
                                {
                                    types.AddRange(Assembly.Load(asm).GetTypes());
                                }
                                newcache.Add(fname, oldentry);
                                continue;
                            }
                            catch (Exception ex)
                            {
#if DEBUG
                                Console.WriteLine("[dev] Failed to load cached assembly for " + fname);
                                Console.WriteLine(ex.ToString());
#endif
                            }
                        }
                    }
                    var scriptlines = script.Replace("\r\n", "\n").Replace("\r", "\n").Split('\n'); // line-ending independent...
                    int pos         = 0;
                    var entry       = new AsmCacheEntry();
                    entry.checksum = checksum;
                    var parameters = new CompilerParameters();
                    parameters.ReferencedAssemblies.AddRange(refs);
                    parameters.GenerateInMemory   = false; // We need to keep the temporary file around long enough to copy it to the cache.
                    parameters.GenerateExecutable = false;
                    try
                    {
                        while (pos < scriptlines.Length)
                        {
                            while (!scriptlines[pos].StartsWith("#Plex"))
                            {
                                pos++;
                            }
                            var templatename = scriptlines[pos].Split(':')[1];
                            pos++;
                            string decorators = "";
                            while (scriptlines[pos].StartsWith("#"))
                            {
                                decorators += scriptlines[pos].Substring(1) + Environment.NewLine; // remove # and add to string
                                pos++;
                            }
                            if (!scriptlines[pos].StartsWith("class "))
                            {
                                throw new Exception("Plex decorators without matching global class");
                            }
                            var classname = scriptlines[pos].Split(' ')[1];
                            if (classname.Contains("(")) // derived class
                            {
                                classname = classname.Split('(')[0];
                            }
                            else
                            {
                                classname = classname.Remove(classname.Length - 1);                                                       // remove :
                            }
                            var code = String.Format(resman.GetString(templatename), decorators, classname, fname.Replace("\\", "\\\\")); // generate the C# wrapper class from template
#if DEBUG
                            Console.WriteLine(code);
#endif
                            var results = provider.CompileAssemblyFromSource(parameters, code);
                            if (results.Errors.HasErrors)
                            {
                                string except = "The wrapper class failed to compile.";
                                foreach (CompilerError error in results.Errors)
                                {
                                    except += Environment.NewLine + error.ErrorText;
                                }
                                throw new Exception(except);
                            }
                            types.AddRange(results.CompiledAssembly.GetTypes()); // We did it!
                            entry.asms.Add(File.ReadAllBytes(results.PathToAssembly));
                            pos++;                                               // keep scanning the file for more classes
                        }
                    }
                    catch (Exception ex) // Skip any file that has issues
                    {
#if DEBUG
                        Console.WriteLine("[dev] Exception in the Python API: file " + fname + ", line " + pos.ToString() + ".");
                        Console.WriteLine(ex.ToString());
#endif
                    }
                    newcache.Add(fname, entry);
                }


#if DEBUG
                Console.WriteLine("[dev] " + types.Count.ToString() + " Python mods loaded successfully.");
#endif
                if (types.Count > 0)
                {
                    ReflectMan.AddTypes(types.ToArray());
                    using (var stream = File.OpenWrite("pyasmcache.dat"))
                        AsmCache.Save(stream, newcache);
                }
                scanned = true;
            }
            catch
            {
            }
        }