【发布时间】:2012-10-18 00:04:18
【问题描述】:
所以,我正在尝试以 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++ 源代码部分。
【问题讨论】:
-
双插座?双缓冲?为什么20001特别?不要单独编码。使用 System.Net 取得成功。
-
我不确定...恐怕我没有编写此代码(我只是将其移植到 Linux 和 Android)...我有非常具体的理由在系统上使用它.Net,其中大部分都围绕没有适当网络实现(或非常原始/限制性实现)的支持框架......
-
永远不要使用字符串作为返回类型。使用 IntPtr 获取使用 msdn.microsoft.com/en-us/library/7b620dhe.aspx 的字符串。至于 int 大小 int 在任何 .net 平台上都是 Int32,所以我建议在 c++ 端使用 stdint.h 和 int32_t。
标签: c# dll crash pinvoke 64-bit