C#请求插件

本文关键字:插件 请求 | 更新日期: 2023-09-27 18:23:58

我正在尝试在我的应用程序中实现简单的插件系统,但我与插件的通信有问题。

我制作了我的插件接口:

public interface IAlgorithm
{
    /// <summary>
    /// New request in current simulation tick - all logic should be run after request
    /// </summary>
    /// <param name="pTime">Simulation time in [ms] from simulation start</param>
    /// <param name="pObject">Manipulating object</param>
    /// <param name="pWorld">Current world</param>
    void Request(int pTime, PhysicalObject pObject, World pWorld);
}

接下来我创建了挂钩键盘插件:

 public class Main : IAlgorithm
{
    private int m_Direction;
    private readonly GlobalKeyboardHook m_Hook = new GlobalKeyboardHook();
    public Main()
    {
        m_Hook.HookedKeys.Add(Keys.Up);
        m_Hook.HookedKeys.Add(Keys.Down);
        m_Hook.HookedKeys.Add(Keys.Right);
        m_Hook.HookedKeys.Add(Keys.Left);
        m_Hook.KeyDown += KeyClicked;
    }
    private void KeyClicked(object sender, KeyEventArgs e)
    {
        switch (e.KeyCode)
        {
            case Keys.Down:
                m_Direction = 180;
                break;
            case Keys.Up:
                m_Direction = 0;
                break;
            case Keys.Left:
                m_Direction = 90;
                break;
            case Keys.Right:
                m_Direction = 270;
                break;
        }
    }
    public void Request(int pTime, PhysicalObject pObject, World pWorld)
    {
        pObject.Movement.Power = 100;
        pObject.Movement.Direction = m_Direction;
    }
}

接下来,在我的主程序中,我尝试使用我的插件,如下所示:

var myAssembly = Assembly.LoadFile(myPath).GetTypes().First(x => x.Name == "Main");
IAlgorithm myAlgorithm = ((IAlgorithm)Activator.CreateInstance(myAssembly ));

它正在工作,但如果我想提出一些插件的请求

myAlgorithm.Request(pSimulationTime, myPhysicalObject, pWorld);

在那之后,我在myPhysicalObject 中没有任何更改

但是如果我使用MessageBox:

myAlgorithm.Request(pSimulationTime, myPhysicalObject, pWorld); 
MessageBox.Show(myPhysicalObject.Movement.Direction)

我可以看到以MB为单位的正确值。

我不知道我的逻辑中有什么不正确的地方,也不明白为什么在停顿了一段时间后它仍然有效。你有什么想法吗??

C#请求插件

如果您没有按下任何键,我希望它会给您0

既然您已经钩住了方向键,那么在void KeyClicked(object sender, KeyEventArgs e)中放入一条log/console.writeline语句来找出其中的神奇之处。