在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 = 7

message = 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 subprocess

def 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuanpan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值