我有一个插件,它为输入获取值并返回结果。我正在加载它:
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上看到它。 GLOBAL_VARIABLES.MODULES [0]执行10次,而不是执行我的插件的10个实例。
似乎像plugin_instances.exec(i)的行为类似于对GLOBAL_VARIABLES.MODULES [0]的引用,而不是GLOBAL_VARIABLES.MODULES [0]的单独副本。
如何让每个实例个体化,而不是作为参考?谢谢!
答案 0 :(得分:0)
更新以反映问题修改:
您需要为要执行的每个模块创建一个新的模块类型实例。您可能需要清理以下代码,但它会为您提供以下想法:
plugin_instances.add(Activator.CreateInstance(GLOBAL_VARIABLES.MODULES[0].GetType()));
答案 1 :(得分:0)
由于你想制作一个副本,而你想复制的类型有一个无参数构造函数,你可以动态创建一个新实例:
var moduleType = GLOBAL_VARIABLES.MODULES[0].GetType();
for(int i=0; i<10; i++)
{
plugin_instances.add((MY_API)Activator.CreateInstance(moduleType));