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

如何将含第三方库的Python项目转为DLL供C#调用?解决调用exe返回空问题

Python项目转DLL供C#调用及exe调用失败修复

一、先修复PyInstaller生成exe后的C#调用失败问题

你的Python代码仅定义了类和方法,但未处理命令行参数,也未将结果输出到标准输出,导致C#调用时无法获取返回值。修改后的Python代码如下:

import sys

class A:
    def add(self, a, b):
        return a + b
    def subtract(self, a, b):
        return a - b

if __name__ == "__main__":
    if len(sys.argv) < 4:
        sys.exit(1)
    func_name = sys.argv[1]
    arg1 = int(sys.argv[2])
    arg2 = int(sys.argv[3])
    
    obj = A()
    if func_name == "add":
        print(obj.add(arg1, arg2))
    elif func_name == "subtract":
        print(obj.subtract(arg1, arg2))
    else:
        sys.exit(1)

重新用PyInstaller打包(去掉--windowed参数,避免隐藏控制台导致标准输出无法捕获):

pyinstaller --onefile math_operation.py

修改后C#调用即可获取正确输出。

二、将带第三方库的Python项目转换为DLL供C#调用

PyInstaller无法直接生成DLL,以下是三种可行方案:

1. Python.NET(推荐)

允许C#直接嵌入Python运行时,调用Python代码及第三方库,无需编译DLL:

  • 在C#项目中通过NuGet安装Python.Runtime包
  • 确保C#项目能找到Python安装目录及OpenCV、Pandas等依赖库路径
  • C#调用示例:
using Python.Runtime;

class Program
{
    static void Main(string[] args)
    {
        PythonEngine.Initialize();
        
        using (Py.GIL())
        {
            dynamic module = Py.Import("math_operation");
            dynamic obj = module.A();
            
            int addResult = obj.add(3, 4);
            int subResult = obj.subtract(10, 6);
            
            Console.WriteLine($"3+4={addResult}");
            Console.WriteLine($"10-6={subResult}");
        }
        
        PythonEngine.Shutdown();
    }
}

将math_operation.py放在C#项目输出目录,同时确保Python环境已安装所需第三方库。

2. Cython编译为C扩展DLL

将Python代码转换为C代码后编译成DLL,适合性能要求高的场景:

  • 安装依赖:pip install cython,并安装Visual Studio的C++开发组件
  • 创建setup.py:
from setuptools import setup
from Cython.Build import cythonize

setup(
    name="MathOperations",
    ext_modules=cythonize("math_operation.py"),
)
  • 编译生成DLL:
python setup.py build_ext --inplace

生成的.pyd文件(Windows下等价于DLL)可通过C#的DllImport调用,需注意Python与C#的类型映射。

3. Nuitka编译为DLL

将Python代码编译为C/C++代码后生成DLL:

  • 安装Nuitka:pip install nuitka
  • 编译命令:
python -m nuitka --module math_operation.py

生成的.pyd文件可通过DllImport调用,支持第三方库打包。

注意事项

  • 确保Python环境的第三方库与C#项目架构(x86/x64)一致
  • 编译DLL方案需注意Python代码的全局状态和资源释放问题
  • Python.NET方案灵活易集成,但依赖Python运行环境;编译DLL方案可脱离Python环境,但配置相对复杂

内容的提问来源于stack exchange,提问作者user24257486

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:30:14