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