我想为扩展创建引擎,现在我有一个名为“Module”的基本类,其中包含很多虚函数,每个扩展都是继承“模块”并用自己的代码覆盖函数(主要是钩子)。为c#应用程序创建一个扩展,它调用在主机程序中定义的静态函数
我希望能够把这些扩展名分开,并加载它“即时”。
我创建了一个简单的处理程序加载这些插件:
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 mscorlib程序)
这里是例子就是我希望能够做到:
有一个主机应用程序包含扩展处理程序,以及一些自己的静态函数。 宿主应用程序从二进制文件中加载模块并将其插入到某些模块数组中(这是每个继承“模块”的类的构造函数中所做的事情),该模块包含一些调用宿主应用程序的静态函数的函数。我需要做的是能够调用宿主应用程序的源代码中定义的静态函数,即使在插件的源代码中,它也不包含静态函数的代码。我希望它有一点清晰: )
该静态类是否在主机中有依赖关系? – Hardrada
是的,它基本上不可能“复制粘贴”到模块,因为我可能必须复制整个主机应用程序的整个代码 – Petr
@Hardrada其实我只是想创建一些API函数,这个扩展可以通过主机通信,(改变应用程序中现有的东西等) – Petr