c# - 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#
解决方案
您将函数导出为__stdcall
,但在 C# 中将其声明为CallingConvention.Cdecl
.
将 DllImport 更改为:
[DllImport(@"SniReceiver.dll", CallingConvention = CallingConvention.StdCall)]
.
推荐阅读
- html - CSS 字体大小和填充样式在 Ipad 上无法正常工作
- css - 为什么flex容器的孙子溢出?
- gprs - 如何从 rlc 的角度进行 ip 数据包传输?
- python - python rdd计数功能失败
- sharepoint - 无法设置 OAuthentication
- css - 为什么 Grid Container 选择只显示第一列?
- c# - 无法加密 Azure CloudFile。能够加密 Azure Blob
- mysql - 是否有任何 MySQL 字符串函数可以在一个字符串中添加两个或多个字符串并可以显示从最后一个字符串开始的新字符串?
- netlogo - NetLogo 6.2版本如何在界面上创建一个按钮来显示补丁变量的值?
- php - php删除多维关联数组中的空“列”