C #, не могу загрузить несколько экземпляров плагина - PullRequest
0 голосов
/ 07 ноября 2011

У меня есть один плагин, который принимает значение для входа и возвращает результат.Я загружаю это так:

public void load_modules()
{
    string path = Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName;
    string pluginDir = Path.GetDirectoryName(path) + "\\Modules";

    foreach (string s in Directory.GetFiles(pluginDir, "*.dll"))
    {
        Type[] pluginTypes = Assembly.LoadFile(s).GetTypes();

        foreach (Type t in pluginTypes)
        {
            if (t.ToString().Contains("Main"))
            {
                MY_API module = Activator.CreateInstance(t) as MY_API;


                GLOBAL_VARIABLES.MODULES.Add(module);

                break;
            }
        }
    }

}

Вот код, который я использую для запуска плагина:

 List<MY_API> plugin_instances  = new List<MY_API>(); // define container of the instances
 for(int i=0; i<10; i++){
     plugin_instances.add(GLOBAL_VARIABLES.MODULES[0]); // loaded module from load_modules()

     MessageBox.show(plugin_instances.exec(i)); // execute plugin
 }

И у меня есть таймер для мониторинга до второстепенного состоянияпервый загруженный модуль.

label1.text = GLOBAL_VARIABLES.MODULES[0].getStatus();

Функция getStatus () отображает, какая переменная передается в функцию exec () плагина.

Проблема в том, что Я не не выполнил * GLOBAL_VARIABLES.MODULES [0] *, я использовал его только для копирования с него.Я выполнил все плагины в списке * plugin_instances *, который должен содержать 10 копий * GLOBAL_VARIABLES.MODULES [0] *.

К моему удивлению, GLOBAL_VARIABLES.MODULES [0] выполняется, хотя это не должно выполняться, я вижу это на label1.Вместо выполнения 10 экземпляров моего плагина, GLOBAL_VARIABLES.MODULES [0] выполняется 10 раз.

Похоже, что plugin_instances.exec (i) действует как ссылка на GLOBAL_VARIABLES.MODULES [0] вместо отдельной копии GLOBAL_VARIABLES.MODULES [0].

Как я могу получить каждый экземпляр индивидуально, а не в качестве справки?Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 ноября 2011

Поскольку вы хотите сделать копию, а тип, для которого вы хотите сделать копию, имеет конструктор без параметров, вы можете просто динамически создать новый экземпляр:

 var moduleType = GLOBAL_VARIABLES.MODULES[0].GetType();
 for(int i=0; i<10; i++)
 {
     plugin_instances.add((MY_API)Activator.CreateInstance(moduleType)); 
0 голосов
/ 07 ноября 2011

Обновление для отражения модификации вопроса:

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

 plugin_instances.add(Activator.CreateInstance(GLOBAL_VARIABLES.MODULES[0].GetType()));
...