EntryPointNotFoundException: 无法在 DLL“onnxruntime”中找到名为“OrtGetApiBase”的入口点
一、只在类库项目中安装了NuGet包,没有在运行项目中安装
1.先创建一个OnnxLibrary类库项目,并安装NuGet包
建议直接装Microsoft.ML.OnnxRuntime.Gpu版本,因为兼容CPU推理,Microsoft.ML.OnnxRuntime版本,仅支持CPU推理
其依赖的包会自动安装
2.随意写一个onnx调用的类
using Microsoft.ML.OnnxRuntime;
using Microsoft.ML.OnnxRuntime.Tensors;
using System.Collections.Generic;
using System.Linq;
namespace OnnxLibrary
{
public class ONNX
{
readonly InferenceSession model;
public ONNX(string model_path,bool useGPU=true,int gpuDeviceId=0)
{
if (useGPU)
{
var gpuSessionOptoins = SessionOptions.MakeSessionOptionWithCudaProvider(gpuDeviceId);
gpuSessionOptoins.InterOpNumThreads = 8;
gpuSessionOptoins.IntraOpNumThreads = 8;
gpuSessionOptoins.GraphOptimizationLevel = GraphOptimizationLevel.ORT_ENABLE_ALL;
model = new InferenceSession(model_path, gpuSessionOptoins);
}
else
model = new InferenceSession(model_path);
}
public void Run()
{
Tensor<float> inputData = new DenseTensor<float>(new[] { 1, 1, 1280, 1280 });
var inputs = new List<NamedOnnxValue>
{
NamedOnnxValue.CreateFromTensor("inputs", inputData)
};
var outputs = model.Run(inputs);
var outputToFeed = outputs.First();
Tensor<float> outputData = outputToFeed.AsTensor<float>();
}
}
}
3.创建一个控制台项目csID
随意创建的
4.引用该类库
4.调用ONNX类
using OnnxLibrary;
namespace csID
{
class Program
{
static void Main(string[] args)
{
ONNX oNNX = new ONNX(@"model.onnx");
oNNX.Run();
}
}
}
5.运行控制台项目
错啦~
重装NuGet包,错啦~
运行CPU推理,错啦~
解决方法:
在控制台项目中安装ONNXRuntime包即可
此刻该项目没有安装任何包
安装完成
再运行项目
错误 无法复制文件“C:\Users\user\Desktop\Test\packages\Microsoft.ML.OnnxRuntime.Gpu.1.16.3\runtimes\win-x86\native\onnxruntime.dll”,原因是找不到该文件。 csID
错啦~
不要惊慌,项目默认首选32位,取消即可
再运行,过啦~
提示:
当你的解决方案中项目很多时可能会出现下面的错误
内部异常 1: FileLoadException: 未能加载文件或程序集“System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040) 内部异常 2: FileLoadException: 未能加载文件或程序集“System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
只需要在解决方案资源管理器中搜索System.Runtime.CompilerServices.Unsafe,即可找到所有引用该程序集的项目,检查并将其全部同一成一个版本的程序集即可