C#项目没有为自己写的c++ dll定义入口点

Posted

技术标签:

【中文标题】C#项目没有为自己写的c++ dll定义入口点【英文标题】:C# project doest not defined entry point for c++ dll written by myself 【发布时间】:2019-07-24 11:10:44 【问题描述】:

我正在使用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' 的入口点。

记住我在我的c# exe 旁边复制了SniReceiver.dll

【问题讨论】:

您是否尝试过使用 Depends 之类的工具检查您的 DLL? C++ 习惯于对函数名称应用名称修饰,因此实际发布的名称可能仅以您期望的名称开头。要检查的另一件事是两个项目的目标位数相同(32 位或 64 位 Windows)。 @SteveTodd 这两个项目都在 x86 中。依赖步行者没有帮助我。我怎么能用那个?我将在Depends中发送dll的图片 @SteveTodd 我已经在我编辑的帖子中添加了 Dependency walker。 公开方法。 【参考方案1】:

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

将 DllImport 更改为:

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

【讨论】:

@EyIM 感谢您的回答。我在 C++ 方面并不专业。你能给我一些参考或书来让我在 C++ 中变得更好吗?有没有为您突出显示的参考资料? 更多关于调用约定:codeproject.com/Articles/1388/Calling-Conventions-Demystified

以上是关于C#项目没有为自己写的c++ dll定义入口点的主要内容,如果未能解决你的问题,请参考以下文章

C# 无法在未损坏的 C++ 库上找到入口点

无法在 DLL 中找到入口点

找不到 DLL 入口点

C# .dll 程序集可以包含入口点吗?

C#调用C DLL笔记,提示:无法在 DLL“xxx.dll”中找到名为“xxxx”的入口点

C#调用C DLL笔记,提示:无法在 DLL“xxx.dll”中找到名为“xxxx”的入口点