c#调用c++的DLL,接口函数参数有函数指针,在线等解决办法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#调用c++的DLL,接口函数参数有函数指针,在线等解决办法相关的知识,希望对你有一定的参考价值。

c++接口函数原型为:
C/C++ code
void Connecter(int ServerPort,void(* pF)(char* buf,char* ClientIP,int ClientPort));
我这样写的c#调用:
C# code
public partial class Default

[DllImport("MyServerDLL.dll",
EntryPoint = "Connecter",
CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern void Connecter(int ServerPort, IntPtr P);

public delegate void FunctionDelegate(IntPtr buf, IntPtr ClientIP, int ClientPort);

void Callback(IntPtr buf, IntPtr ClientIP, int ClientPort)

showLb.Text = buf.ToString();


。。。
protected void serverBtn_Click(object sender, EventArgs e)

//IntPtr intPtr = new IntPtr();----------------如果这样写,异常:值不能为空。参数名: ptr

//int nSizeOfCallback = Marshal.AllocHGlobal(Callback);-------------如果这样写,由于Callback是函数,所以不能Marshal.AllocHGlobal(Callback);
//IntPtr intPtr = Marshal.AllocHGlobal(nSizeOfCallback);-----我将nSizeOfCallback改为64注释掉上一行,试验一下,提示:指定结构必须能直接复制到本机结构中,或是具有布局信息。
参数名: structure

Marshal.StructureToPtr(new FunctionDelegate(Callback).Target, intPtr, true);
Connecter(5000, intPtr);




我没用过c#,所以不太知道这种情况下怎么调c++的DLL。请高手帮我写下这段代码。谢了,在线等

你这个功能,做好用c++实现,因为c#是托管代码,给不出rcvdata
rcvaddr这个函数指针来给c++调用。
也就是说,你得写个c++的dll实现该功能,然后用c#加载你自己的c++
dll。
怎么调用dll方法网上有,不贴了。
参考技术A C#用委托做参数 参考技术B 很简单的,首先选择项目,添加引用,就能像使用一个类使用dll中的类了

以上是关于c#调用c++的DLL,接口函数参数有函数指针,在线等解决办法的主要内容,如果未能解决你的问题,请参考以下文章

当参数之一是指针数组时,如何从 C# 调用 C++ DLL

C#怎么调用C++的dll?

C#如何调用C++的DLL的结构体数组指针

如何从 C# 调用具有 void* 回调和对象参数的 C++ Dll 中的函数

C#调用C++的dll中的函数,数组指针的问题

C#中调用dll,函数参数带指针,如何改写?