-2

我有一个插件,它为输入取值并返回结果。我像这样加载它:

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* 列表中的所有插件,其中应该包含 *GLOBAL_VARIABLES.MODULES[0]* 的 10 个副本。

令我惊讶的是 GLOBAL_VARIABLES.MODULES[0] 被执行,即使它不应该被执行,我可以在 label1 上看到它。GLOBAL_VARIABLES.MODULES[0] 不是执行我的插件的 10 个实例,而是执行 10 次。

似乎 plugin_instances.exec(i) 的行为类似于对 GLOBAL_VARIABLES.MODULES[0] 的引用,而不是 GLOBAL_VARIABLES.MODULES[0] 的单独副本。

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

4

2 回答 2

0

更新以反映问题修改:

您需要为每个要执行的模块类型创建一个新实例。您可能需要清理以下代码,但它为您提供了思路:

 plugin_instances.add(Activator.CreateInstance(GLOBAL_VARIABLES.MODULES[0].GetType()));
于 2011-11-07T01:52:28.727 回答
0

由于您要制作副本并且要制作副本的类型具有无参数构造函数,因此您可以动态创建一个新实例:

 var moduleType = GLOBAL_VARIABLES.MODULES[0].GetType();
 for(int i=0; i<10; i++)
 {
     plugin_instances.add((MY_API)Activator.CreateInstance(moduleType)); 
于 2011-11-07T02:04:37.737 回答