.NET Framework 4.8环境下无ML.NET的ONNX Runtime运行方案咨询
在.NET Framework 4.8中运行ONNX推理的可行方案
方案1:直接使用官方ONNX Runtime的.NET Framework兼容包
ONNX Runtime官方提供了支持.NET Framework 4.6.1及以上版本的NuGet包,无需依赖ML.NET即可独立运行推理。
操作步骤:
- 在Visual Studio中,右键项目→管理NuGet程序包,搜索并安装
Microsoft.ML.OnnxRuntime(选择兼容.NET Framework 4.8的稳定版本即可)。 - 基础推理代码示例:
using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; // 加载ONNX模型 var sessionOptions = new SessionOptions(); using var session = new InferenceSession("your_model.onnx", sessionOptions); // 构造输入张量(需匹配模型输入维度,示例为float类型4维张量) var inputTensor = new DenseTensor<float>(new[] {1, 3, 224, 224}); // 填充预处理后的输入数据 // 创建输入字典,"input_name"需匹配模型的输入节点名称 var inputs = new List<NamedOnnxValue> { NamedOnnxValue.CreateFromTensor("input_name", inputTensor) }; // 运行推理 using var outputs = session.Run(inputs); // 处理输出结果 var outputTensor = outputs.First().AsTensor<float>(); // 提取数据并完成后续业务逻辑
注意事项:
- 模型文件需随程序一同发布,确保路径正确。
- 需根据实际模型的输入输出节点名称、张量维度调整代码参数。
方案2:通过P/Invoke调用ONNX Runtime原生C API
如果NuGet包存在兼容性问题,可直接调用ONNX Runtime的原生C接口,借助.NET的P/Invoke机制实现推理。
操作步骤:
- 下载对应平台(如Windows x64)的ONNX Runtime原生二进制文件(包含
onnxruntime.dll),放入项目输出目录。 - 在C#中声明核心C API函数:
using System.Runtime.InteropServices; public static class OnnxRuntimeNative { [DllImport("onnxruntime.dll", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr OrtCreateEnv(out IntPtr env); [DllImport("onnxruntime.dll", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr OrtCreateSession(IntPtr env, string modelPath, IntPtr sessionOptions, out IntPtr session); // 按需补充创建张量、运行推理、释放资源等API声明 }
- 编写C#代码封装完整流程:环境初始化→会话创建→输入张量构造→推理执行→资源释放。
优缺点:
- 优点:完全脱离.NET层封装,灵活性拉满,适配特殊场景。
- 缺点:需手动管理内存和资源,代码复杂度高,需熟悉ONNX Runtime的C API文档。
方案3:使用社区维护的轻量封装库
部分社区项目提供了针对.NET Framework的ONNX Runtime轻量封装,无需依赖ML.NET,可选择兼容.NET Framework 4.8的版本。这类库简化了原生API的调用流程,但需注意项目的维护状态和兼容性。
内容的提问来源于stack exchange,提问作者user101464
相关产品推荐
相关产品推荐

