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

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调用,性能最优。

步骤:

    1. 确保你用的是.NET 6及以上版本(.NET 7+对AOT的支持更完善)
    1. 修改C#类库的.csproj项目文件,添加AOT编译配置:
<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>
    1. 编译发布原生共享库:
dotnet publish -c Release

编译完成后,在bin/Release/net7.0/linux-x64/publish目录下会生成类似libYourLibrary.so的文件。

    1. 在Python中调用这个原生库:
      首先要确保你的C#方法用[UnmanagedCallersOnly]特性标记,这样AOT编译时才会生成原生可调用的入口:
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调用。

步骤:

    1. 安装pythonnet:
pip install pythonnet
    1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:57:21