为了账号安全,请及时绑定邮箱和手机立即绑定

在通过 P/Invoke 获得的 C++ 结构上设置 C# 回调

在通过 P/Invoke 获得的 C++ 结构上设置 C# 回调

C#
暮色呼如 2021-08-07 17:10:54
我正在尝试使用我得到的外部 C++ dll(我没有源代码)。DLL 有一个函数返回一个指向struct. 它struct定义了一系列函数指针,用作我的应用程序的回调函数。根据我收到的“文档”,我只是通过将指针设置为我自己的回调方法来“注册”我的回调,如下所示:server->OnConnectionRequest = &myObj.OnConnectionRequest;但是,我试图在 C# 中实现这一点。我已经部分成功了。我可以:加载DLL;struct*从函数中获取指针;调用对象上预定义的一些方法。我不能做的是在对象上设置我自己的回调:编译器没有抱怨,运行时没有抱怨,但仍然没有调用回调。我这样定义了委托类型和类(请注意,以前它被定义为一个结构体,它的工作方式不一样):// Original C++ signature from the header:// void (*OnRemoteConnectionRequest)(void *caller, const char *ip, int &accept);[UnmanagedFunctionPointer(CallingConvention.Cdecl)]public delegate void OnRemoteConnectionRequestDelegate(IntPtr caller, string ip, ref int accept);[StructLayout(LayoutKind.Sequential)]public class RemoteServerPluginI{    public OnRemoteConnectionRequestDelegate OnRemoteConnectionRequest;    // another dozen callbacks omitted}我有一个静态助手来从 dll 中检索实例:public static class RemoteControlPlugin{    [DllImport("data/remoteplugin.dll", CallingConvention = CallingConvention.Cdecl)]    private static extern IntPtr GetServerPluginInterface();    private static RemoteServerPluginI _instance = null;    public static RemoteServerPluginI Instance    {        get        {            if (_instance != null)                return _instance;            var ptr = GetServerPluginInterface();            _instance = Marshal.PtrToStructure<RemoteServerPluginI>(ptr);            if (_instance == null)                throw new InvalidOperationException("Could not obtain the server instance");            return _instance;        }    }}最后这是我用来注册我的回调的方式:public class CallBacks{    public CallBacks(RemoteServerPluginI server)    {        server.OnRemoteConnectionRequest = this.OnRemoteConnectionRequest;    }然而,当我使用客户端应用程序尝试连接到我的服务器时,我的回调永远不会运行。如您所见,在我的回调中,我拒绝了连接,因此客户端应该退出并出现错误,但事实并非如此。我究竟做错了什么?
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 209 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信