Почему все Dll не загружаются в выпадающем списке - PullRequest
0 голосов
/ 14 декабря 2010

У меня есть такая функция

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

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

Эта функция должна получить имя всех библиотек

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;
}

и должен быть заполнен в раскрывающемся списке при возврате сюда

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

Но он не получает все dll, созданные таким образом

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

Мне нужно загрузить полный список DLL в раскрывающемся списке.

Где я иду не так ???

1 Ответ

1 голос
/ 14 декабря 2010

Ты знаешь, где это не работает?Содержит ли переменная "args" что-нибудь?Я подозреваю, что ваша проблема в том, как вы строите пути.Вы должны использовать класс Path, а не строковые операции.

Чтобы получить текущий исполняемый каталог:

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

Вы должны использовать это для построения вашего DirectoryInfo в начале GetAllPlugins ()метод тоже.Чтобы построить путь с подпапкой:

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

Чтобы получить все файлы в подкаталоге плагина с расширением dll:

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

Обратите внимание, что возвращаемые имена файлов содержат полный путь.Вам не нужно ничего добавлять:

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)
    {
        ...
    }
}

должно работать.

Кроме того, не используйте подстроку, если вы хотите, чтобы имена файлов, с расширением или без, вы должны использоватьPath.GetFileName или Path.GetFileNameWithoutExtension.

И используйте этот метод для создания экземпляра вашего плагина: http://msdn.microsoft.com/en-us/library/wccyzw83.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...