openvino 官方不提供 c# api,所有所谓绑定均为非官方封装或进程外调用;推荐方案是 c# 启 python 子进程执行推理,或改用 onnx runtime。

OpenVINO C# API 不存在,别白费劲找 nuget 包
OpenVINO 官方从没提供过 C# 原生绑定。你搜到的所谓 OpenVINO.NET 或 OpenVinoSharp 要么是极早期未维护的实验项目,要么是封装了 c++ DLL 的薄层包装,稳定性、API 同步性、IR 版本兼容性全无保障。
常见错误现象:DllNotFoundException、AccessViolationException、加载 .xml 时崩溃、推理结果乱码或全零——绝大多数源于底层 C++ 运行时与 .NET 运行时内存/线程模型不匹配,或 IR 格式版本(v10/v11/v12)与 OpenVINO C++ SDK 不一致。
- 官方唯一支持的语言是 C++ 和 Python;Python 绑定靠
openvino.runtime,C# 没对应模块 - 所有“C# 调用 OpenVINO”方案,本质都是进程外调用:起子进程跑 Python 脚本,或用 P/Invoke 封装官方 C++ DLL(需自己编译、严格匹配 OpenVINO 版本)
- IR 文件(
.xml+.bin)本身是纯数据,C# 可以读,但没 runtime 就只是二进制废料
最可行路径:用 Python 子进程 + 标准 IO 通信
绕过 DLL 封装风险,用 Process.Start 启一个轻量 Python 脚本做推理,C# 只管传图、收结果。这是目前线上项目验证过的最低成本方案。
使用场景:windows/linux 服务端部署、对延迟不敏感(单次推理增加 ~50–200ms 启动开销)、模型输入输出结构固定(如分类/检测 bbox)。
- Python 端必须用官方
openvino.runtime(>=2023.3),确保 IR 兼容;推荐用ov.Core()加载,别用已弃用的InferenceEngine - C# 传图建议用 base64 或 raw RGB bytes(避免 JPEG 编解码失真),Python 端用
np.frombuffer解析 - 输出统一为 json 字符串写 stdout,C# 用
process.StandardOutput.ReadLine()读取,避免换行符截断 - 务必设置
process.StartInfo.UseShellExecute = false,否则重定向失效
示例 Python 脚本(run_inference.py):
import sys import json import numpy as np from openvino.runtime import Core <p>core = Core() model = core.read_model(sys.argv[1]) compiled = core.compile_model(model, "CPU") infer = compiled.create_infer_request()</p><p>while True: line = sys.stdin.readline().strip() if not line: break data = json.loads(line) img_bytes = bytes(data["image_b64"], "utf-8") img = np.frombuffer(base64.b64decode(img_bytes), dtype=np.uint8).reshape(data["shape"]) res = infer.infer({0: img}) print(json.dumps({"output": res[0].tolist()})) sys.stdout.flush()
P/Invoke 封装 C++ DLL:只适合有 C++ 能力的团队
如果你控制得了构建环境、能自己编译 OpenVINO C++ SDK,并且愿意长期维护 ABI 兼容性,这条路可行;否则就是埋雷。
容易踩的坑:
- OpenVINO C++ SDK 的 DLL(如
inference_engine.dll、openvino.dll)依赖特定 MSVC 运行时(如vcruntime140_1.dll),C# 项目必须匹配,否则DllNotFoundException无提示 - IR 加载函数签名随版本变:旧版用
InferenceEngine::CNNNetReader,新版用ov::Core::read_model,C# 的[DllImport]必须严格对应 - 内存所有权混乱:C++ 分配的 tensor 内存不能被 C# GC 回收,必须显式调用
ov::Tensor::data()后用Marshal.copy拷贝出来 - 多线程调用需加锁:
ov::Core实例不是线程安全的,每个推理线程应持有独立ov::CompiledModel
替代方案:改用 ONNX Runtime(C# 原生支持)
如果模型来源可控(pytorch/tensorflow 训练),直接导出 ONNX,用官方 microsoft.ML.OnnxRuntime nuget 包——这才是 C# 生态里真正开箱即用的路径。
性能对比:在 CPU 上,ONNX Runtime(with OpenMP)和 OpenVINO 推理耗时通常相差
- 转换命令:
python -m torch.onnx.export model.pth model.onnx --input shape(注意opset_version=14+) - C# 加载只需几行:
var session = new InferenceSession("model.onnx"),输入OrtValue,输出自动映射 - IR → ONNX 工具存在(
mo.py --output_format=ONNX),但部分自定义层可能丢失,需验证输出一致性
复杂点在于模型转换链路:训练框架 → IR → ONNX → C#,每一步都可能引入精度偏差或 shape 错误。别跳过逐层比对输出 tensor 的步骤。