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

在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.xdnf.cn/news/715897.html

相关文章:

  • Java集合操作常见错误与最佳实践
  • OSCP备战-SickOs1.2靶场详细步骤
  • 第九章 MQTT报文
  • C primer plus (第六版)第六章 编程练习第10题
  • 关于《DAHSF》即《火小兔智慧开发平台V2.0》的碎碎念
  • ADC同步采样
  • XMOS以全新智能音频及边缘AI技术亮相广州国际专业灯光音响展
  • 【NebulaGraph】查询案例(七)
  • 两个频率比较接近的简谐振动叠加后会产生拍形
  • C#学习:基于LLM的简历评估程序
  • 4. 算法与分析 (1)
  • 【Dify系列教程重置精品版】第十一章:Dify与slenium
  • Flutter下的一点实践
  • 手动移植FreeRTOS
  • 用 Python 模拟雪花飘落效果
  • Oracle 临时表空间详解
  • Oracle的NVL函数
  • 前端面试题-HTML篇
  • C++:栈帧、命名空间、引用
  • 第三章:地下三层的技术遗产
  • JaCoCo 是什么
  • 系统架构设计师案例分析----经典架构风格特点
  • 挡片/测试晶圆(Dummy Wafer)通俗解析
  • 非线性声学计算与强化学习融合框架:突破复杂环境人机交互的新技术
  • C++进阶--C++11(04)
  • Golang 配置国内代理
  • Android高级开发第二篇 - JNI 参数传递与 Java → C → Java 双向调用
  • 【第4章 图像与视频】4.5 操作图像的像素
  • FastAPI JWT和hash加密
  • 数据中台系统是什么意思?如何实现数据中台的搭建?