Linux环境下Python调用.NET Core C#库的实现方法求助
在Linux下用Python调用.NET Core C#类库的可行方案及问题修复
当然可行!在Linux环境下用Python调用.NET Core编写的C#类库完全没问题,不过你现在碰到的错误是个典型的平台适配问题——ctypes.WinDLL是Windows平台专属的API,Linux下的ctypes根本没有这个属性,这就难怪会报AttributeError了。
先解决你当前的错误
Linux下的共享库是.so格式(不是Windows的.dll),而且不能用WinDLL加载,得用ctypes.CDLL。不过这里还要注意:默认的.NET Core类库是IL字节码格式,不是原生共享库,直接用ctypes加载还不行,得先做一些额外处理,下面给你两种最常用的实践方案。
实践方案1:将C#类库编译为Linux原生共享库(AOT)
这种方式会把C#代码编译成Linux原生机器码,生成.so文件,能直接被Python通过ctypes调用,性能最优。
步骤:
- 确保你用的是.NET 6及以上版本(.NET 7+对AOT的支持更完善)
- 修改C#类库的
.csproj项目文件,添加AOT编译配置:
- 修改C#类库的
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net7.0</TargetFramework> <!-- 替换成你的Linux架构,比如linux-arm64适配ARM设备 --> <RuntimeIdentifier>linux-x64</RuntimeIdentifier> <PublishAot>true</PublishAot> <NativeLib>Shared</NativeLib> </PropertyGroup> </Project>
- 编译发布原生共享库:
dotnet publish -c Release
编译完成后,在bin/Release/net7.0/linux-x64/publish目录下会生成类似libYourLibrary.so的文件。
- 在Python中调用这个原生库:
首先要确保你的C#方法用[UnmanagedCallersOnly]特性标记,这样AOT编译时才会生成原生可调用的入口:
- 在Python中调用这个原生库:
using System.Runtime.InteropServices; namespace YourNamespace { public class YourLibrary { [UnmanagedCallersOnly(EntryPoint = "Add")] public static int Add(int a, int b) { return a + b; } } }
然后在Python中调用:
import ctypes as ct # 加载生成的原生共享库 lib = ct.CDLL("./libYourLibrary.so") # 声明方法的参数类型和返回值类型 lib.Add.argtypes = [ct.c_int, ct.c_int] lib.Add.restype = ct.c_int # 调用方法并输出结果 result = lib.Add(2, 3) print(result) # 输出5
实践方案2:使用Python.NET(pythonnet)直接加载.NET程序集
如果不想折腾AOT编译,这是更省心的方式——pythonnet能直接加载.NET的dll程序集,无需修改C#代码,支持完整的.NET API调用。
步骤:
- 安装pythonnet:
pip install pythonnet
- 在Python中加载并调用C#类库:
import clr # 添加你的C#类库所在的路径(如果dll在当前目录可以省略路径,直接写文件名) clr.AddReference("/path/to/YourLibrary.dll") # 导入C#的命名空间和类 from YourNamespace import YourLibrary # 创建类实例并调用方法 lib_instance = YourLibrary() result = lib_instance.Add(2, 3) print(result)
这种方式不需要依赖AOT编译,适合快速开发,尤其是需要调用复杂.NET类或使用.NET框架特性的场景,唯一的要求是Linux环境下要安装好.NET Core运行时。
两种方案对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| AOT原生共享库 | 性能高,不依赖.NET运行时 | 需要修改C#代码标记方法,编译配置复杂 |
| Python.NET | 无需修改C#代码,支持完整.NET API,开发效率高 | 运行时依赖.NET Core,性能略低于原生调用 |
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

