Blazor Server集成ML.NET报错:无法加载Microsoft.ML.Vision程序集
Blazor Server集成ML.NET模型加载失败问题解决
问题描述
在Blazor Server应用中集成ML.NET模型时,抛出错误:无法加载文件或程序集'Microsoft.ML.Vision',系统找不到指定文件。已将模型压缩包设置为嵌入资源,但问题未解决;另外发现,若将流参数改为不存在的文件路径,代码会抛出System.IO.File错误,而非当前的System.Reflection.TargetInvocationException。
相关代码:
public static class AIModel { public enum Label { Undefined, Bolnav, Sanatos } private static string MLNetModelPath = "BlazorTWProject.AiModelMers.zip"; public static readonly Lazy<PredictionEngine<ImageInput, ImageOutput>> PredictEngine = new Lazy<PredictionEngine<ImageInput, ImageOutput>>(AIModel.CreatePredictEngine, true); public static ImageOutput Predict(ImageInput input) { var predEngine = PredictEngine.Value; return predEngine.Predict(input); } private static PredictionEngine<ImageInput, ImageOutput> CreatePredictEngine() { MLContext? mlContext = new MLContext(); var thisAssembly = Assembly.GetExecutingAssembly(); var files= thisAssembly.GetManifestResourceNames(); using var stream = thisAssembly.GetManifestResourceStream(MLNetModelPath) ; ITransformer mlModel = mlContext.Model.Load(stream, out DataViewSchema _); return mlContext.Model.CreatePredictionEngine<ImageInput, ImageOutput>(mlModel); } }
解决方案
1. 安装Microsoft.ML.Vision NuGet依赖包
错误的核心原因是项目缺少计算机视觉相关的ML.NET组件,加载视觉模型必须依赖Microsoft.ML.Vision包:
- 方式一:通过NuGet包管理器搜索
Microsoft.ML.Vision并安装到Blazor Server项目; - 方式二:Package Manager Console执行命令:
Install-Package Microsoft.ML.Vision - 方式三:.NET CLI执行命令:
dotnet add package Microsoft.ML.Vision
2. 验证嵌入资源命名正确性
即使设置了嵌入资源,名称不匹配也会导致加载失败:
- 右键模型文件
AiModelMers.zip,打开属性面板,确认“生成操作”为嵌入的资源; - 资源完整名称格式为
[项目命名空间].[文件所在目录层级].[文件名],比如文件在根目录就是BlazorTWProject.AiModelMers.zip; - 可以通过代码中
thisAssembly.GetManifestResourceNames()输出所有资源名称,核对是否和MLNetModelPath一致。
3. 优化代码增强错误排查
当前TargetInvocationException是因为Lazy初始化包装了底层异常,添加显式检查可以直接定位问题:
private static PredictionEngine<ImageInput, ImageOutput> CreatePredictEngine() { MLContext mlContext = new MLContext(); var thisAssembly = Assembly.GetExecutingAssembly(); // 打印所有嵌入资源名称,用于调试核对 foreach (var resourceName in thisAssembly.GetManifestResourceNames()) { Console.WriteLine($"嵌入资源:{resourceName}"); } using var stream = thisAssembly.GetManifestResourceStream(MLNetModelPath); if (stream == null) { throw new FileNotFoundException("未找到指定的嵌入模型资源", MLNetModelPath); } ITransformer mlModel = mlContext.Model.Load(stream, out DataViewSchema _); return mlContext.Model.CreatePredictionEngine<ImageInput, ImageOutput>(mlModel); }
4. 确保模型与依赖版本一致
训练模型时使用的Microsoft.ML和Microsoft.ML.Vision版本,必须和Blazor Server项目中安装的版本完全匹配,版本不兼容会导致模型加载失败。
补充说明
当改用不存在的文件路径时,抛出System.IO.File错误是因为直接读取文件的异常会即时暴露;而嵌入资源加载时,异常发生在模型解析阶段(依赖缺失),又被Lazy的初始化逻辑包装成TargetInvocationException,所以优先解决依赖缺失问题是关键。
内容的提问来源于stack exchange,提问作者flesarradu
相关产品推荐
相关产品推荐

