首页 > 解决方案 > C#项目没有为自己写的c++ dll定义入口点

问题描述

我正在使用一个c#套接字来传递它以从c++DLL 接收数据并将接收到的结果返回c#c#.

我有一个c++这样的项目:

SniReceiver.h

#ifdef SNIRECEIVER_EXPORTS
#define SNIRECEIVER_API __declspec(dllexport)
#else
#define SNIRECEIVER_API __declspec(dllimport)
#endif
#include <WinSock2.h>

extern "C" __declspec(dllexport) int __stdcall receive_socket(DWORD socket);

SniReceiver.cpp

#include "stdafx.h"
#include "SniReceiver.h"

#define DEFAULT_BUFLEN 512
char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;

extern "C" __declspec(dllexport) int __stdcall receive_socket(DWORD socket)
{
    int  iResult = recv((SOCKET)socket, recvbuf, recvbuflen, 0);
    return iResult;
}

和我的 C# 应用程序:

[DllImport(@"SniReceiver.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int receive_socket(IntPtr sock);

static void Main(string[] args)
{
    IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("192.168.200.1"), 80);
    Socket sListen = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    sListen.Bind(endpoint);
    sListen.Listen(10);
    Socket sClient = sListen.Accept();

    int rec= receive_socket(sClient.Handle);

    Console.WriteLine("Hello World!");            
    Console.ReadKey();
} 

调用int rec= receive_socket(sClient.Handle); 获取错误时

System.EntryPointNotFoundException: '无法在 DLL 'SniReceiver.dll' 中找到名为'receive_socket' 的入口点。

记住我已经在我的exeSniReceiver.dll旁边复制了c#

使用 DependencyWalker 的图片

标签: c#c++visual-studiodllimportdllexport

解决方案


您将函数导出为__stdcall,但在 C# 中将其声明为CallingConvention.Cdecl.

将 DllImport 更改为:

[DllImport(@"SniReceiver.dll", CallingConvention = CallingConvention.StdCall)].


推荐阅读