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