C#和C相互调用的问题

问题已经解决。。。。
由于是debug信息和error信息。不重要。这里我先吧可变参数的先去掉。
那么这里的
DLL_EXTERN void DLL_API SetPortPoint(pDebug d, pError e, pCanSend c);
就变成了
DLL_EXTERN void DLL_API SetPortPoint(pCanSend c);
我的具体实现是
【C#和C相互调用的问题】 typedef void(*pCanSend)(CAN_PACKET_T *d);
static pCanSend pCanSendHandle =NULL;
DLL_EXTERN void DLL_API SetPortPoint(pCanSend c)
{
\t//pDebugHandle = d;
\t//pErrorHandle = e;
\tpCanSendHandle = c;
}
在DLL的某些地方会
\tif (pCanSendHandle != NULL)
\t\tpCanSendHandle(d);
在C#里面这么写:
//一定要加上这句,要不然C#中的回调函数只要被调用一次,程序就异常退出了!!!
public delegate void pCanSend(ref CAN_PACKET_T d);//搞一个代理

private static extern void SetPortPoint(IntPtr c);//搞一下C的函数
IntPtr fa=new pCanSend(ClrCanSend).Method.MethodHandle.GetFunctionPointer();//获取ClrCanSend的具体函数地址
SetPortPoint(fa);//调用你的c语言DLL 里面的SetPortPoint函数
private void ClrCanSend(ref CAN_PACKET_T d) { Console.WriteLine("ClrCanSend{0}", DateTime.Now); }


    推荐阅读