如何在不知道该类的情况下从另一个dll调用一个类的函数?

时间:2019-01-17 00:35:28

标签: c# function dll call

我目前正在从事的项目(归结为这个问题)包括3个部分:

    - A server class
    - An interface
    - Plugins that implement the interface

现在,我想将消息从插件发送到连接的客户端,该消息是通过DLL在服务器项目中通过DLL加载的。当然,我的服务器类中需要一个函数来发送消息。现在的问题是如何从我的插件中调用此函数,该插件仅知道接口,而无法获取服务器类的单例实例。

从理论上讲,我会在接口中设置一个空的函数指针,然后在加载插件时将其指向我的方法,然后通过该方法将消息发送给客户端。我发现的唯一东西是委托,不能在接口中定义。那么有什么选择呢?

下面是用于说明的伪代码。希望您理解我想做的事,并能帮助我找到解决方案。重要的是,插件不知道有关服务器的任何功能,仅知道SendMessage方法。

伪代码:

public class Server{
    private List<Plugin> mPlugins = new List<Plugin>();

    public Server() {
        LoadPlugins();
    }

    public void SendMessage(string message) {
        // Here I would send my message to some client
    }

    private void LoadPlugins() {
        // Here I'm loading my plugins (*.dll) from a specific folder into my mPlugins list

        // And while I'm looping through my plugins and loading them, I would set the function pointer to SendMessage(); Like:
        plugin.SendMyMessage = SendMessage;
    }
}

public interface SomeAPI {
    string Name {get;set;}
    string Version {get;set;}

    delegate void SendMyMessage(string message);
}

public class SomePlugin : SomeAPI {
    public string Name {get;set;} = "Some plugin";
    public string Version {get;set;} = "v1.0.0";

    void SendMessage(string message) {
        SendMyMessage(message);
    }
}

1 个答案:

答案 0 :(得分:1)

有很多方法可以从插件获取回调(如果我理解正确的话)

为什么不仅仅使用事件,动作或功能

public class ISomething
{
   public Action<string,ISomething> MyCallBack { get; set; }
}

public class Server
{
   private List<ISomething> mPlugins = new List<ISomething>();

   public Server()
   {
      LoadPlugins();
   }

   private void LoadPlugins()
   {
      foreach (var plugin in mPlugins)
         plugin.MyCallBack += MyCallBack;
   }

   private void MyCallBack(string message, ISomething plugin)
   {
      Console.WriteLine(message);
   }
}