我正在尝试从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不能是泛型类型定义
如果您有任何建议可以解决此问题,请告知我们。
答案 0 :(得分: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);