【问题标题】:C#, Can't load multiple instances of a pluginC#,无法加载插件的多个实例
【发布时间】:2011-11-07 01:22:21
【问题描述】:

我有一个插件,它接受输入的值并返回结果。我是这样加载的:

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

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

【问题讨论】:

  • 你在哪里复制GLOBAL_VARIABLES.MODULES[0]?您当前的所有代码显示的是您将相同的实例添加到列表中 10 次,因此该实例当然会执行 10 次。

标签: c# plugins instances


【解决方案1】:

更新以反映问题修改:

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

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

【讨论】:

  • 目录中只加载了一个模块,因此我使用[0]而不是[i]。 GLOBAL_VARIABLES.MODULES 只包含一个模块,我需要从中制作 10 个副本
  • 我现在明白了:您需要在每次通过循环时创建插件模块的新实例,而不仅仅是重用现有的。我已经更新了答案以反映这一点。
  • 非常感谢!这正是我所需要的! ;)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    相关资源
    最近更新 更多