所以,我正在尝试以 64 位模式运行我的 .NET 应用程序。我依赖于可以为 x64 编译的 dll 并且它可以正确加载。我可以调用一些调用,但是当我尝试调用特定调用时,应用程序会完全崩溃。没有错误或任何东西......
错误发生在两个地方之一;要么在这里:
#include "socket.h"
int SenderAddrSize = sizeof(SOCKADDR_IN);
SOCKADDR_IN CSocket::SenderAddr;
...
char* CSocket::tcpip()
{
if(sockid<0)return NULL;
if(getpeername(sockid, (SOCKADDR *)&SenderAddr, &SenderAddrSize) == SOCKET_ERROR)return NULL;
return inet_ntoa(SenderAddr.sin_addr);
}
...
或在这里:
#include "buffer.h"
char CBuffer::retval[20001];
CBuffer::CBuffer()
{
BuffSize = 30;
data = (char*)malloc(BuffSize);
count = 0;
readpos = 0;
writepos = 0;
}
...
你可以在我的 GitHub HERE的socket.cpp和buffer.cpp中找到完整的代码。代码的入口点和调用上述方法的对象都位于 main.cpp
p/invoke 调用如下:
对于插座:
[DllImport("SockLib", CallingConvention = CallingConvention.Cdecl, EntryPoint = "tcpip")]
public static extern String tcpip(Double socket);
对于缓冲区:
[DllImport("SockLib", CallingConvention = CallingConvention.Cdecl, EntryPoint = "createbuffer")]
public static extern Double createbuffer();
为什么代码崩溃的任何想法。这在 x86 中就像一个魅力,只是在 x64 中没有......
另外,作为一个附带问题...如果我将一个 int 写入在 x86 中运行的客户端上的缓冲区并在 x64 服务器上接收它(反之亦然),该 int 是 4 字节还是 8 字节?关键字int是否会因平台特定大小而改变,还是必须指定int64才能获得 8 字节整数?这适用于上述较大问题的 C++ 源代码部分。