Beispiel #1
0
        /// <summary>
        /// Loads Providers from an assembly.
        /// </summary>
        /// <param name="assembly">The path of the Assembly to load the Providers from.</param>
        /// <param name="users">The Users Providers.</param>
        /// <param name="files">The Files Providers.</param>
        /// <param name="pages">The Pages Providers.</param>
        /// <param name="formatters">The Formatter Providers.</param>
        /// <param name="cache">The Cache Providers.</param>
        /// <remarks>The Components returned are <b>not</b> initialized.</remarks>
        public static void LoadFrom(string assembly, out IUsersStorageProviderV30[] users, out IPagesStorageProviderV30[] pages,
                                    out IFilesStorageProviderV30[] files, out IFormatterProviderV30[] formatters, out ICacheProviderV30[] cache)
        {
            Assembly asm = null;

            try
            {
                //asm = Assembly.LoadFile(assembly);
                // This way the DLL is not locked and can be deleted at runtime
                asm = Assembly.Load(LoadAssemblyFromProvider(Path.GetFileName(assembly)));
            }
            catch
            {
                files      = new IFilesStorageProviderV30[0];
                users      = new IUsersStorageProviderV30[0];
                pages      = new IPagesStorageProviderV30[0];
                formatters = new IFormatterProviderV30[0];
                cache      = new ICacheProviderV30[0];

                Log.LogEntry("Unable to load assembly " + Path.GetFileNameWithoutExtension(assembly), EntryType.Error, Log.SystemUsername);
                return;
            }

            Type[] types = null;

            try
            {
                types = asm.GetTypes( );
            }
            catch (ReflectionTypeLoadException)
            {
                files      = new IFilesStorageProviderV30[0];
                users      = new IUsersStorageProviderV30[0];
                pages      = new IPagesStorageProviderV30[0];
                formatters = new IFormatterProviderV30[0];
                cache      = new ICacheProviderV30[0];

                Log.LogEntry("Unable to load providers from (probably v2) assembly " + Path.GetFileNameWithoutExtension(assembly), EntryType.Error, Log.SystemUsername);
                return;
            }

            List <IUsersStorageProviderV30> urs = new List <IUsersStorageProviderV30>( );
            List <IPagesStorageProviderV30> pgs = new List <IPagesStorageProviderV30>( );
            List <IFilesStorageProviderV30> fls = new List <IFilesStorageProviderV30>( );
            List <IFormatterProviderV30>    frs = new List <IFormatterProviderV30>( );
            List <ICacheProviderV30>        che = new List <ICacheProviderV30>( );

            Type[] interfaces;
            for (int i = 0; i < types.Length; i++)
            {
                // Avoid to load abstract classes as they cannot be instantiated
                if (types[i].IsAbstract)
                {
                    continue;
                }

                interfaces = types[i].GetInterfaces( );
                foreach (Type iface in interfaces)
                {
                    if (iface == typeof(IUsersStorageProviderV30))
                    {
                        IUsersStorageProviderV30 tmpu = CreateInstance <IUsersStorageProviderV30>(asm, types[i]);
                        if (tmpu != null)
                        {
                            urs.Add(tmpu);
                            Collectors.FileNames[tmpu.GetType( ).FullName] = assembly;
                        }
                    }
                    if (iface == typeof(IPagesStorageProviderV30))
                    {
                        IPagesStorageProviderV30 tmpp = CreateInstance <IPagesStorageProviderV30>(asm, types[i]);
                        if (tmpp != null)
                        {
                            pgs.Add(tmpp);
                            Collectors.FileNames[tmpp.GetType( ).FullName] = assembly;
                        }
                    }
                    if (iface == typeof(IFilesStorageProviderV30))
                    {
                        IFilesStorageProviderV30 tmpd = CreateInstance <IFilesStorageProviderV30>(asm, types[i]);
                        if (tmpd != null)
                        {
                            fls.Add(tmpd);
                            Collectors.FileNames[tmpd.GetType( ).FullName] = assembly;
                        }
                    }
                    if (iface == typeof(IFormatterProviderV30))
                    {
                        IFormatterProviderV30 tmpf = CreateInstance <IFormatterProviderV30>(asm, types[i]);
                        if (tmpf != null)
                        {
                            frs.Add(tmpf);
                            Collectors.FileNames[tmpf.GetType( ).FullName] = assembly;
                        }
                    }
                    if (iface == typeof(ICacheProviderV30))
                    {
                        ICacheProviderV30 tmpc = CreateInstance <ICacheProviderV30>(asm, types[i]);
                        if (tmpc != null)
                        {
                            che.Add(tmpc);
                            Collectors.FileNames[tmpc.GetType( ).FullName] = assembly;
                        }
                    }
                }
            }

            users      = urs.ToArray( );
            pages      = pgs.ToArray( );
            files      = fls.ToArray( );
            formatters = frs.ToArray( );
            cache      = che.ToArray( );
        }