我想为扩展创建引擎具有自己代码的功能(主要是挂钩)。
我希望能够将这些扩展名放置以分开二进制并"飞行"。
我创建了一个简单的处理程序,用于加载这些插件:
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 at system.reflection.monocmethod.invoke)
这是我想要做的示例:
有一个包含扩展处理程序的主机应用程序,以及一些自己的静态功能。主机应用程序从二进制文件加载模块并将其插入到一些模块中(这是在每个继承"模块"的类的构造函数中完成的。此模块包含一些调用主机应用程序静态功能的函数。什么。我需要能够做到的是能够调用主机应用程序源代码中定义的静态函数,即使在插件的源代码中,它不包含静态函数的代码。我希望这有点清楚:)
好吧,实际上并不像我想象的那样困难,我只是将主机二进制引用到扩展名,这启用了扩展中的所有静态元素和类别。