当前位置: 首页 > article >正文

在Linux环境里面,Python调用C#写的动态库,如何实现?

在Linux环境中,Python可以通过pythonnet(CLR的Python绑定)或subprocess调用C#动态库。以下是两种方法的示例:


方法1:使用pythonnet(推荐)

前提条件
  1. 安装Mono或.NET Core运行时
  2. 安装pythonnet包:
    bash
    pip install pythonnet
     
示例步骤
  1. ​C# 动态库代码​​ (MyLibrary.cs):

csharp

using System;namespace MyLibrary
{public class Calculator{public int Add(int a, int b) => a + b;public static string Greet(string name) => $"Hello, {name}!";}
}
  1. ​编译C#为动态库​​:

bash

# 使用Mono编译
mcs -target:library -out:MyLibrary.dll MyLibrary.cs# 或使用.NET Core
dotnet publish --configuration Release --output ./out
  1. ​Python调用代码​​:

python

import os# ===== 关键设置:强制使用 .NET Core =====
os.environ["PYTHONNET_RUNTIME"] = "coreclr"  # 必须在 import clr 之前!
os.environ["DOTNET_ROOT"] = "/usr/share/dotnet"  # 确保路径正确(可通过 `which dotnet` 确认)# ===== 加载 .NET 库 =====
import clr
clr.AddReference("./MyLibrary.dll")from MyLibrary import Calculator# ===== 调用方法 =====
calc = Calculator()
result = calc.Add(3, 4)  # 调用实例方法
print(f"3 + 4 = {result}")  # 输出: 3 + 4 = 7message = Calculator.Greet("World")  # 调用静态方法
print(message)  # 输出: Hello, World!

方法2:通过subprocess调用(通用方案)

如果pythonnet不可用,可以通过命令行调用C#程序。

  1. ​C# 可执行程序​​ (Program.cs):

csharp

using System;class Program
{static void Main(string[] args){if (args.Length > 0 && args[0] == "add"){int a = int.Parse(args[1]);int b = int.Parse(args[2]);Console.WriteLine(a + b);}}
}
  1. ​编译并运行​​:

bash

# 编译
mcs -out:Program.exe Program.cs# Python调用
import subprocessdef add_numbers(a, b):result = subprocess.run(["mono", "Program.exe", "add", str(a), str(b)],stdout=subprocess.PIPE,text=True)return int(result.stdout)print(add_numbers(5, 3))  # 输出: 8

关键注意事项

  1. ​运行时依赖​​:

    • 必须安装Mono (sudo apt install mono-complete) 或.NET Core
    • pythonnet在Linux上需要libgdiplus(部分系统需手动安装)
  2. ​路径问题​​:

    • 动态库路径需使用绝对路径或确保Python工作目录正确
  3. ​跨平台兼容性​​:

    • 若使用.NET Core,编译时指定运行时标识符(如linux-x64
  4. ​性能考虑​​:

    • pythonnet适合高频调用,subprocess适合低频简单调用

故障排查

  • 如果clr.AddReference失败,尝试:

    python

    import os
    os.environ["MONO_GAC_PREFIX"] = "/usr"  # 或Mono的实际安装路径

  • 确保动态库架构与Python解释器匹配(同为x64或x86)

http://www.lryc.cn/news/2393860.html

相关文章:

  • 【Linux 基础知识系列】第三篇-Linux 基本命令
  • OpenCV CUDA模块直方图计算------生成一组均匀分布的灰度级函数evenLevels()
  • 深度学习常见实验问题与实验技巧
  • 前端面试之Proxy与Reflect
  • uniapp vue3 鸿蒙支持的 HTML5+接口
  • 一张Billing项目的流程图
  • 理想树图书:以科技赋能教育,开启AI时代自主学习新范式
  • 【大模型02】Deepseek使用和prompt工程
  • B端产品经理如何快速完成产品原型设计
  • [Java实战]Spring Boot切面编程实现日志记录(三十六)
  • Apache POI生成的pptx在office中打不开 兼容问题 wps中可以打卡问题 POI显示兼容问题
  • 大学大模型教学:基于NC数据的全球气象可视化解决方案
  • Python学习(2) ----- Python的数据类型及其集合操作
  • 机器学习算法-决策树
  • MediaMtx开源项目学习
  • Linux安装EFK日志分析系统
  • Linux(9)——进程(控制篇——下)
  • E. Melody 【CF1026 (Div. 2)】 (求欧拉路径之Hierholzer算法)
  • @Pushgateway 数据自动清理
  • 粽叶飘香时 山水有相逢
  • YC-8002型综合变配电监控自动化系统
  • react diff 算法
  • 近期手上的一个基于Function Grap(类AWS的Lambda)小项目的改造引发的思考
  • Obsidian 社区插件下载修复
  • VSCode的下载与安装(2025亲测有效)
  • 千库/六图素材下载工具
  • Ansible模块——Ansible的安装!
  • 差分S参数-信号与电源完整性分析
  • ​扣子Coze飞书多维表插件-查询数据
  • 计算机模拟生物/化学反应有哪些软件?