如何将含第三方库的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
相关产品推荐
相关产品推荐

