2010-12-14 15 views
0

J'ai une fonction comme cellePourquoi tous les DLLs ne sont pas chargés en déroulant

public void SetOperationDropDown() 
     { 
      cmbOperations.DataSource = PluginManager.GetAllPlugins(); 

      if(cmbOperations.Items.Count > 0) 
      { 
       cmbOperations.SelectedItem = cmbOperations.Items[0]; 
      } 
     } 

Cette fonction doit obtenir le nom de tous les dll

public class PluginManager 
{ 

    /// <summary> 
    /// This function gets the name of the plugins and return that in a List<string>. 
    /// </summary> 
    /// <param name="args"></param> 
    /// <returns></returns> 
public static List<string> GetAllPlugins() 
{ 

    DirectoryInfo objDirectoryInfo = new DirectoryInfo("Plugins"); 
    FileInfo[] args = objDirectoryInfo.GetFiles("*.dll"); 

    List<string> assemblyNames = new List<string>(); 
    Assembly[] oAssemblies = new Assembly[args.Length]; 

    for(int assemblyCount = 0;assemblyCount < args.Length;assemblyCount++) 
    { 
     string executablePath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase); 

     oAssemblies[assemblyCount] = Assembly.LoadFile(executablePath.Remove(0,6) + "\\Plugins\\" + args[assemblyCount].Name); 

     try 
     { 
      foreach(Type oType in oAssemblies[assemblyCount].GetTypes()) 
      { 
       // Check whether class is inheriting from IMFDBAnalyserPlugin. 
       if(oType.GetInterface("IMFDBAnalyserPlugin") == typeof(IMFDBAnalyserPlugin)) 
       { 
        assemblyNames.Add(args[assemblyCount].Name.Substring(args[assemblyCount].Name.LastIndexOf("\\") + 1)); 
       } 
      } 
     } 
     catch(Exception ex) 
     { 
      EventLog log = new EventLog("Application"); 
      log.Source = "MFDBAnalyser"; 
      log.WriteEntry(ex.Message); 
     } 
    } 

    // Passing data one application domain to another. 
    AppDomain.CurrentDomain.SetData("AssemblyNames", assemblyNames.ToArray()); 
    return assemblyNames; 
} 

et doivent être placés dans la liste déroulante quand ils sont retournés ici

 //Checks for the selectedItem in the cmbOpearions dropdown and make call to appropriate functions. 


    string assemblyName = Convert.ToString(cmbOperations.SelectedValue); 
    Assembly assembly = Assembly.LoadFrom(assemblyName); 

    int fileExtensionPos = assemblyName.LastIndexOf("."); 
    string fileName = assemblyName.Substring(0, fileExtensionPos); 

    Type localType = assembly.GetType(fileName + "." + fileName); 

Mais il ne reçoit pas tous les dll créés à partir de cette façon

Type localType = assembly.GetType(fileName + "." + fileName); 

J'ai besoin de charger la liste complète des DLL dans la liste déroulante.

Où je vais mal ???

+0

Quels événements sont enregistrées par l'intermédiaire de votre gestionnaire d'exceptions? –

Répondre

1

Savez-vous où cela ne fonctionne pas? Est-ce que la variable "args" contient quelque chose? Je soupçonne que votre problème est la façon dont vous construisez des chemins. Vous devriez utiliser la classe Path, pas les opérations de chaîne.

Pour obtenir le répertoire exécutable en cours:

string executablePath = Path.GetDirectoryName(Application.ExecutablePath); 

Vous devriez l'utiliser pour construire votre DirectoryInfo au début de la méthode GetAllPlugins() aussi. Pour construire un chemin avec un sous-dossier:

string pluginPath = Path.Combine(executablePath, "Plugin"); 

Pour obtenir tous les fichiers dans le sous-répertoire du plugin qui ont l'extension dll:

string[] pluginFiles = Directory.GetFiles(pluginPath, "*.dll"); 

Notez que les noms de fichiers renvoyés contiennent tout le chemin. Vous n'avez pas besoin d'ajouter quoi que ce soit:

foreach (string fileName in pluginFiles) 
{ 
    Assembly assembly = Assembly.LoadFrom(fileName); 
    List<Type> types = assembly.GetTypes().ToList(); 
    foreach (Type type in types.FindAll(t => t.GetInterface("IMFDBAnalyserPlugin") != null) 
    { 
     ... 
    } 
} 

devrait fonctionner.

De même, n'utilisez pas la sous-chaîne, si vous voulez les noms de fichiers, avec ou sans extension, vous devez utiliser Path.GetFileName ou Path.GetFileNameWithoutExtension.

Et utiliser cette méthode pour instancier votre plugin: http://msdn.microsoft.com/en-us/library/wccyzw83.aspx