为c#应用程序创建扩展,调用宿主程序中定义的静态函数

时间:2012-11-05 12:53:26

标签: c#

我想为扩展创建引擎,现在我有一个名为" Module"的基本类。其中包含许多虚函数,每个扩展都是一个继承"模块"并使用自己的代码覆盖函数(主要是钩子)。

我希望能够将这些扩展程序放在单独的二进制文件中,并在运行中加载它#34;

我创建了一个加载这些插件的简单处理程序:

    public static bool LoadMod(string path)
    {
        try
        {
            if (File.Exists(path))
            {
                System.Reflection.Assembly library = System.Reflection.Assembly.LoadFrom(path);
                if (library == null)
                {
                    Program.Log("Unable to load " + path + " because the file can't be read", true);
                    return false;
                }
                Type[] types = library.GetTypes();
                Type type = library.GetType("wmib.RegularModule");
                Type pluginInfo = null;
                foreach (Type curr in types)
                {
                    if (curr.IsAssignableFrom(type))            
                    {
                        pluginInfo = curr;
                        break;
                    }
                }
                if (pluginInfo == null)
                {
                    Program.Log("Unable to load " + path + " because the library contains no module", true);
                    return false;
                }
                Module _plugin = (Module)Activator.CreateInstance(pluginInfo);
                return true;
            }
        }
        catch (Exception fail)
        {
            core.handleException(fail);
        }
        return false;
    }

我的问题是这些模块在宿主应用程序中的静态类中调用函数。是否有可能创造一些"骨架"这个静态类的扩展源代码?我尝试在第二个源代码中创建具有相同名称和参数的空函数的类,但由于某种原因它不起作用(每次我尝试加载它时我得到:异常被一个目标抛出了System.Reflection.MonoCMethod.Invoke上的invocation.mscorlib)

以下是我希望能够做到的例子:

有一个宿主应用程序包含扩展处理程序和一些自己的静态函数。 宿主应用程序从二进制文件加载模块并将其插入到某些模块数组中(这是在继承"模块"的每个类的构造函数中完成的。此模块包含一些调用静态函数的函数我需要做的是能够调用主机应用程序源代码中定义的静态函数,即使在插件的源代码中,也不包含静态函数' s代码。我希望它有点明确:)

1 个答案:

答案 0 :(得分:0)

好吧,它实际上并没有像我想的那么难,我只是将主机二进制文件引用到扩展名,它启用了扩展中所有静态元素和主机类。