C #, не удается загрузить несколько экземпляров плагина

#c# #plugins #instances

#c# #Плагины #экземпляры

Вопрос:

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

 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].

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

Комментарии:

1. где вы делаете копию GLOBAL_VARIABLES.MODULES[0] ? Весь ваш текущий код показывает, что вы добавляете один и тот же экземпляр в список 10 раз, поэтому, конечно, этот экземпляр выполняется 10 раз.

Ответ №1:

Обновите, чтобы отразить изменение вопроса:

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

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

Комментарии:

1. Из каталога загружен только один модуль, поэтому я использую [0] вместо [i]. GLOBAL_VARIABLES.MODULES содержит только один модуль, из которого мне нужно сделать 10 копий

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

Ответ №2:

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

  var moduleType = GLOBAL_VARIABLES.MODULES[0].GetType();
 for(int i=0; i<10; i  )
 {
     plugin_instances.add((MY_API)Activator.CreateInstance(moduleType));