そのため、.NET アプリケーションを 64 ビット モードで実行しようとしています。x64 用にコンパイルできる dll に依存しており、正しくロードされます。一部の呼び出しを呼び出すことはできますが、特定の呼び出しを呼び出そうとすると、アプリが完全にクラッシュします。エラーなどはありません...
エラーは 2 つの場所のいずれかで発生します。ここのいずれか:
#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();
コードがクラッシュする理由。これは、x64ではなく、x86ではすべて魅力的に機能します...
また、副次的な質問として... x86 で実行されているクライアントのバッファーに int を書き込み、x64 サーバーでそれを受信した場合 (またはその逆)、その int は 4 バイトまたは 8 になりますか? キーワードintはプラットフォーム固有のサイズで変更されますか? または、8 バイトの整数を取得するにはint64を指定する必要がありますか? これは、上記のより大きな質問の C++ ソース コード部分に当てはまります。