如何调用一个函数通过使用相同的东西,但在其他地方,使用反射

本文关键字:何调用 反射 其他 一个 函数 调用 | 更新日期: 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#中是行不通的。即使类型具有完全相同的命名空间和完全相同的名称,如果它们来自不同的程序集,它们也是不同的类型。

你应该做的是只在主可执行文件中定义基本类型。在这个插件中,添加一个对主可执行文件的引用,你就可以引用主可执行文件的公共类型,并从它们派生。