【问题标题】:How to call a function of a class from another dll without knowing the class?如何在不知道类的情况下从另一个 dll 调用类的函数?
【发布时间】:2019-01-17 00:35:28
【问题描述】:

我目前正在进行的项目(简化为这个问题)由 3 个部分组成:

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

现在我想从一个插件向连接的客户端发送一条消息,该插件通过服务器项目中的反射作为 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);
    }
}

【问题讨论】:

    标签: c# function dll call


    【解决方案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);
       }
    }
    

    【讨论】:

    • 可能是因为我还不知道关键字 Action 和 Func :P。我知道事件,即使我还没有使用它们,但感觉不适合这个目的。我一直在 C# 中寻找函数指针的替代方案,但只遇到了委托。我最初来自 C++(如果你想考虑的话,在 PHP 之前)并且有类似 int(*fooPtr)() = foo;或类似的东西。无论如何,我现在在行动中阅读自己,这正是使用的正确方法。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2015-03-12
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 2018-12-19
    • 1970-01-01
    相关资源
    最近更新 更多