You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用g++编译DLL是否必须实现DLLEntryPoint/WinMain入口函数?

结论

WinMain和自定义DllEntryPoint均不是g++(MinGW环境)编译可用DLL的必需项,你观察到的「不实现这两个函数的DLL仍可正常被C#项目加载调用」是符合Windows平台DLL运行机制的正常现象。

具体技术原因

关于DllEntryPoint

  • 你提到的教程里给出的DllEntryPoint是老旧Borland/Embarcadero系列C编译器默认识别的DLL入口函数名,对g(MinGW)、MSVC等当前主流编译器来说,默认约定的DLL入口函数名为DllMain,你写的DllEntryPoint不会被自动识别为入口点,哪怕加入编译也只是个永远不会被系统调用的冗余函数。你加了该文件后DLL能正常工作,本质是MinGW自带的默认CRT入口一直在生效,和你写的DllEntryPoint没有关系。
  • 即使你完全不自定义DLL入口点,MinGW自带的C运行时(CRT)已经提供了成熟的默认DLL入口实现:该默认入口会自动处理C运行时初始化/清理、全局C++对象构造/析构、atexit注册回调调度等基础工作,执行完必要初始化逻辑后直接返回成功值,完全能覆盖绝大多数普通DLL的运行需求。只有当你需要在DLL加载/卸载、进程内线程创建/销毁的时机执行自定义逻辑(比如手动初始化全局资源、配置线程局部存储等)时,才需要自行实现入口点函数。

关于WinMain

  • WinMain是Windows GUI子系统下独立EXE可执行文件的用户态入口点,和DLL完全无关。DLL是依附于其他可执行进程加载运行的库文件,本身不是可独立启动的程序,根本不需要提供EXE对应的入口函数。
  • 你把WinMain实现加入DLL代码后能正常编译,只是因为链接器默认不会剔除未被引用的冗余函数,这个函数在DLL的整个生命周期中都不会被系统调用,没有任何实际作用。
补充说明

你当前使用__declspec(dllexport)宏配合extern "C"修饰导出函数的写法是正确的,只要导出符号符合C# P/Invoke的调用约定,DLL的CRT初始化流程正常,就可以被C#项目正常加载调用,不需要额外添加教程中提到的冗余入口文件。

内容的提问来源于stack exchange,提问作者user19435638

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 01:45:44