如何调用一个函数通过使用相同的东西,但在其他地方,使用反射
本文关键字:何调用 反射 其他 一个 函数 调用 | 更新日期: 2023-09-27 18:15:06
这是我的插件/外部对象
namespace Outer
{
interface IMonster
{
String GetName();
}
interface IPlugin
{
String GetGameVersion();
long GetPureTime();
IMonster GetMonster(int iEntityIndex);
}
abstract class TheHack
{
public abstract void OnEnabled(IPlugin pluginInterface);
public abstract void OnDisabled();
}
class Plugin : TheHack
{
public override void OnEnabled(IPlugin pluginInterface)
{
Console.WriteLine(pluginInterface.GetMonster(0).GetName());
}
public override void OnDisabled()
{
Console.WriteLine("Plugin disabled");
}
}
}
这是我的内部代码,获取插件程序集,创建一个新的外部类实例并执行它,并从我的内部代码传递全局插件对象到类实例。
namespace Inner
{
interface IMonster
{
String GetName();
}
interface IPlugin
{
String GetGameVersion();
long GetPureTime();
IMonster GetMonster(int iEntityIndex);
}
abstract class TheHack
{
public abstract void OnEnabled(IPlugin pluginInterface);
public abstract void OnDisabled();
}
class ImplMonster : IMonster
{
public String GetName()
{
return "A cute cat";
}
}
class Impl: IPlugin
{
public String GetGameVersion()
{
return "-1";
}
public long GetPureTime()
{
return DateTime.Now.Ticks;
}
public IMonster GetMonster(int iEntityIndex)
{
return new ImplMonster();
}
}
class Program
{
static void Main(string[] args)
{
var tp = Assembly.Load("plugin.dll").GetType("Outer.Plugin");
if (tp != null)
{
var cls = Activator.CreateInstance(tp);
MethodInfo mi = tp.GetMethod("OnEnabled", new[] {typeof (IPlugin)});
if (mi != null && tp.IsSubclassOf(typeof (TheHack)))
{
mi.Invoke(cls, new[] {new Implementation()});
}
}
Console.ReadLine();
}
}
}
但是当我调试这些代码时,在控制台上没有结果,所以我决定取消null保护代码,但是调试器告诉我Inner中的对象不能应用于Outer,但是它们扩展,实现了相同的类,相同的结构,但是调试器只是告诉我它不能运行。
为什么会发生这种情况,以及如何忽略/绕过检查,因为我想做一个插件系统,在那里我可以在c++中操作纯虚拟方法来实现这一点,但在c#中,没有相同的相关(c#中没有纯虚拟函数,认为抽象函数类似于但类型安全,并且我不能传递内存地址,因为我没有运行不安全的代码)也没有任何类似的方法来做到这一点。
看起来每个类型都定义了两次:一次在插件中,一次在主可执行文件中。在其他一些环境中,这是唯一的方法,但在c#中是行不通的。即使类型具有完全相同的命名空间和完全相同的名称,如果它们来自不同的程序集,它们也是不同的类型。
你应该做的是只在主可执行文件中定义基本类型。在这个插件中,添加一个对主可执行文件的引用,你就可以引用主可执行文件的公共类型,并从它们派生。