Python.NET支持Python与.NET双向互调:Python可调用.NET类型,.NET也能嵌入Python解释器;需匹配Python 3.8–3.11与.NET 6+或Framework 4.7.2+,注意初始化、类型转换及线程安全。

用 Python.NET,.NET 项目就能直接调用 Python 代码,反过来 Python 也能加载 .NET 程序集——关键在于正确安装、初始化和类型转换。
安装与环境准备
Python.NET 不支持所有 Python 版本和 .NET 运行时组合,务必匹配清楚:
- 推荐使用 Python 3.8–3.11(64位),对应 .NET 6 / .NET 7 / .NET 8(或 .NET Framework 4.7.2+)
- Windows 上 pip 安装最简单:pip install pythonnet
- Linux/macOS 需先装 Mono 或 .NET SDK,并设置 PYTHONNET_PYDLL_PATH 指向 libpython 和 libmono
- 若用 .NET 6+,确保项目启用 UseWpf 或 UseWindowsForms(如需 GUI 互操作)
在 Python 中调用 .NET 类型
这是最常用场景:从 Python 脚本中创建 C# 对象、调用方法、处理事件。
- 先导入并初始化:import clr; clr.AddReference("System"); from System import String, DateTime
- 加载自定义程序集:clr.AddReference(r"C:\path\to\MyLibrary.dll"),然后 from MyNamespace import MyClass
- 注意类型转换:Python 字符串自动转为 System.String,但 list/dict 需手动转为 System.Collections.Generic.List[T] 等
- 调用泛型类要写全名,例如:List_string = clr.GetClrType(System.Collections.Generic.List[String])
在 .NET 中嵌入 Python 解释器
适合需要在 C# 应用里执行动态脚本、热重载逻辑或集成 AI 模型的场景。
立即学习“Python免费学习笔记(深入)”;
- C# 中引用 Python.Runtime,用 PythonEngine.Initialize() 启动解释器
- 用 PythonEngine.Exec("x = 1 + 1") 或 PythonEngine.Eval("2 ** 8") 执行代码
- 把 .NET 对象传给 Python:Py.Import("builtins").GetAttr("globals").SetItem("myobj", myDotNetObj)
- 回调 Python 函数到 C#?用 PyObject.Invoke 并确保参数类型兼容(如用 PyObject.As
() 提取值)
常见问题与避坑提示
很多报错其实源于环境或生命周期管理不当:
- “System.MissingMethodException”:多半是 .NET 版本不匹配,或调用了仅在高版本存在的 API
- “Cannot load assembly”:检查 DLL 是否有未满足的依赖(用 dotnet list package 或 Dependencies.exe 查)
- 多线程下 Python.NET 默认不安全:C# 多线程调 Python 前必须调用 PythonEngine.AcquireLock() / ReleaseLock()
- 内存泄漏风险:Python 对象持有 .NET 引用时,避免循环引用;显式调用 Dispose() 或 GC.Collect() 辅助清理
基本上就这些。不用封装 REST API 或启动子进程,Python.NET 让两边真正跑在同一个进程里——只要版本对得上、初始化到位、类型转得准,交互很自然。










