【问题标题】:Sending a method pointer as a integer parameter to a C++ method from C#从 C# 将方法指针作为整数参数发送到 C++ 方法
【发布时间】:2017-02-28 01:29:20
【问题描述】:

我正在尝试从 C++ dll 中调用一个方法,该方法将 JSON 字符串作为参数。嵌入在 json 格式字符串中的参数之一是 unsigned int,表示调用方法时应调用的回调函数的地址。以下是它在 C++ 中的调用方式:

Json::Value jsval;
jsval["cmd"] = "logon";
jsval["Arg"]["IP"] = szIP;
jsval["Arg"]["PORT"] = nPort;
jsval["Arg"]["CALLBACK"] = (unsigned int)TheMsgCallback;
Json::FastWriter writer;
std::string sender = writer.write(jsval);
JScmd((char*)sender.c_str()) 

这就是我尝试在 C# 中做同样事情的方法

Delegate callbackDelegate = new Action<int, IntPtr, ulong, int, int>(messageCallback);
IntPtr p = Marshal.GetFunctionPointerForDelegate(callbackDelegate);
string s = Converter.Serialize(new loginRequest() { Arg = new ArgParam() { IP = "10.0.0.121", PORT = 7020, CALLBACK = (uint)p } });
JScmd(s);

问题是当我尝试在 C# 中做同样的事情时,它没有工作,我在这一行得到一个错误

Marshal.GetFunctionPointerForDelegate

上面写着

指定的 Type 不能是泛型类型定义

如果您有任何解决此问题的建议,请告诉我。

【问题讨论】:

    标签: c# c++ pointers interop marshalling


    【解决方案1】:

    试试这个:

    public delegate void MyDelegate(int i, IntPtr j, ulong k, int l, int m);
    ...
    MyDelegate callbackDelegate = new MyDelegate(messageCallback);
    IntPtr p = Marshal.GetFunctionPointerForDelegate(callbackDelegate);
    

    【讨论】:

      猜你喜欢
      • 2015-02-12
      • 1970-01-01
      • 1970-01-01
      • 2014-02-24
      • 2017-11-26
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多