我想为扩展创建引擎,现在我有一个名为“模块”的基本类,其中包含许多虚函数,每个扩展都是一个继承“模块”并用自己的代码覆盖函数(主要是钩子)的类。
我希望能够将这些扩展放在单独的二进制文件中并“即时”加载它。
我创建了一个简单的处理程序来加载这些插件:
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;
}
我的问题是这些模块正在调用我在主机应用程序中拥有的静态类中的函数。是否可以在扩展的源代码中创建这个静态类的一些“骨架”?我尝试在第二个源代码中使用具有相同名称和参数的空函数创建类,但这由于某种原因不起作用(每次我尝试加载它时,我都会得到:调用的目标已抛出异常。 mscorlib 在 System.Reflection.MonoCMethod.Invoke)
这是我希望能够做的示例:
有一个宿主应用程序包含扩展处理程序和一些自己的静态函数。宿主应用程序从二进制文件加载模块并将其插入到一些模块数组中(这是在每个继承“模块”的类的构造函数中完成的。这个模块包含一些调用宿主应用程序静态函数的函数。什么我需要做的是能够调用在主机应用程序的源代码中定义的静态函数,即使在不包含静态函数代码的插件源代码中。我希望它清楚一点:)