日期:2014-05-18  浏览次数:20971 次

C++ 数据类型与C#中的对应关系
最近做的项目,要在C#中调用C++写的dll
但是无论怎么写总是有“对 PInvoke 函数的调用导致堆栈不对称。原因可能是托管的 PInvoke..."这样的爆报错。查了下可能是数据类型的问题,网上的搜到过很多这种对照表,但是我这个函数中有几个数据类型不在这些对照表中,试过网上说的 几种,到最后还是有问题。所以请大家帮我看一下,到底是什么问题。

C++: const char *pszBuffer,DWORD dwSize,chsr **pszOutPut,DWORD *pdwRecv

在C#中我用过以下几种:
string sendStr, int sendSize, string[] recvStr, int recvSize
string sendStr, int sendSize, ref string recvStr, ref int recvSize
string sendStr, UInt32 sendSize, string recvStr, UInt32 recvSize
StringBuilder sendStr, UInt32 sendSize, ref string recvStr, ref UInt32 recvSize
但是总是会报那个错。到底是该用什么数据类型呢?

------解决方案--------------------
string sendStr, int sendSize, ref string recvStr, ref int recvSize
上面这个是对应的正确声明
其实楼主的这个error很多时候都是由于CallingConvention引起的
这样:
[DllImport("...dll", CallingConvention = CallingConvention.Cdecl)]
------解决方案--------------------
在C++里面,char不一定是字符的意思,等价于C#的byte,要看具体情况,因此char*就等价于C#的byte[],而后面又跟着一个参数来指定前面这个const char*的长度,可见更不可能是字符串了,因为C++里面的字符串是以0x00结尾的二进制数组,遇到0x00自动认为是字符串的结束标志,不需要指定长度,它却指定了,因此可以看出那个不代表传递的是字符串。