C#,无法加载插件的多个实例

时间:2011-11-07 01:22:21

标签: c# plugins instances

我有一个插件,它为输入获取值并返回结果。我正在加载它:

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]的单独副本。

如何让每个实例个体化,而不是作为参考?谢谢!

2 个答案:

答案 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));