为调用宿主程序中定义的静态函数的c#应用程序创建扩展
我想为扩展创建引擎,现在我有一个名为“Module”的基本类,它包含很多虚拟函数,每个扩展都是一个类,它继承“Module”,并用自己的代码覆盖函数(大部分是钩子) 我希望能够将这些扩展放在单独的二进制文件中,并“动态”加载它 我创建了一个用于加载这些插件的简单处理程序:为调用宿主程序中定义的静态函数的c#应用程序创建扩展,c#,C#,我想为扩展创建引擎,现在我有一个名为“Module”的基本类,它包含很多虚拟函数,每个扩展都是一个类,它继承“Module”,并用自己的代码覆盖函数(大部分是钩子) 我希望能够将这些扩展放在单独的二进制文件中,并“动态”加载它 我创建了一个用于加载这些插件的简单处理程序: public static bool LoadMod(string path) { try { if (File.Exists(path))
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的目标抛出)
以下是我希望能够做到的示例:
有一个包含扩展处理程序和一些自己的静态函数的主机应用程序。
宿主应用程序从二进制文件加载模块,并将其插入到一些模块数组中(这是在继承“模块”的每个类的构造函数中完成的.此模块包含一些调用宿主应用程序静态函数的函数。我需要能够调用宿主应用程序源代码中定义的静态函数,甚至插件源代码中定义的静态函数,其中不包含静态函数的代码。我希望有一点清楚:)好的,实际上并不像我想的那么难,我只是将主机二进制文件引用到扩展中,它启用了扩展中主机的所有静态元素和类。该静态类在主机中有依赖项吗?是的,基本上不可能将其“复制粘贴”到模块中,因为我可能要复制整个主机的全部代码application@Hardrada实际上,我只想创建一些API函数,这个扩展可以通过(更改应用程序中的现有内容等)与主机通信