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

使用NuGet和ctypes调用C# DLL时Python提示找不到add函数

问题根因
  • 你当前使用的原版RGiesecke.DllExport包仅支持.NET Framework 4.x及以下版本,完全不兼容.NET 6(.NET Core/.NET 5+)运行时。该包的实现逻辑是编译后修改IL代码注入原生导出标记,在.NET 6项目中安装后不会执行这一步骤,最终编译出的DLL是纯托管程序集,导出表里根本没有你声明的add函数,ctypes加载后自然找不到对应符号。
  • 平台位数不匹配是常见叠加诱因:如果C#项目选了AnyCPU并勾选「首选32位」,但本地Python是64位版本,或者反过来32位Python加载64位DLL,也会出现函数找不到、甚至DLL加载失败的问题。
  • 路径加载错误:如果没有指定DLL的绝对路径,Python可能加载到同目录下其他同名的非导出DLL,也会触发该报错。
修复步骤
  • 先卸载项目中已安装的原版RGiesecke.DllExport包,安装适配.NET 5+版本的DllExport组件,该衍生维护版本支持.NET 6/7/8全系列运行时,安装时在弹出的配置界面选中当前需要导出函数的项目,匹配和你本地Python一致的平台架构(x64/x86),确认配置写入项目。
  • 打开C#项目属性面板,切换到「生成」选项卡,将平台目标从AnyCPU改为和本地Python位数一致的选项:64位Python选x64,32位Python选x86,取消勾选「首选32位」选项;同时关闭程序集裁剪、单文件发布功能,避免编译时导出的函数被裁剪掉。
  • 重新编译项目后,先做导出校验:用Dependencies工具打开编译输出目录下的DLL,查看导出函数列表,确认add函数存在后再写Python调用逻辑。
  • Python侧调用时优先使用DLL的绝对路径加载,同时显式声明函数的参数类型和返回值类型,避免后续出现参数栈错乱的问题,参考代码如下:
import ctypes
# 替换为你本地编译出的DLL的完整绝对路径
dll = ctypes.CDLL(r"C:\project\bin\Debug\net6.0\app.dll")
dll.add.argtypes = (ctypes.c_int, ctypes.c_int)
dll.add.restype = ctypes.c_int
print(dll.add(2, 3))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:15:58