升级NuGet包后触发MissingMethodException的原因及解决方法
NuGet包升级后Torch模型加载异常问题排查
问题背景
将项目中的NuGet包从以下版本:
<PackageReference Include="Microsoft.ML" Version="3.0.0-preview.23266.6" /> <PackageReference Include="Microsoft.ML.ImageAnalytics" Version="3.0.0-preview.23266.6" /> <PackageReference Include="Microsoft.ML.TorchSharp" Version="0.21.0-preview.23266.6" /> <PackageReference Include="Microsoft.ML.Vision" Version="3.0.0-preview.23266.6" /> <PackageReference Include="TorchSharp-cuda-windows" Version="0.99.5" />
升级至:
<PackageReference Include="Microsoft.ML" Version="3.0.1" /> <PackageReference Include="Microsoft.ML.ImageAnalytics" Version="3.0.1" /> <PackageReference Include="Microsoft.ML.TorchSharp" Version="0.21.1" /> <PackageReference Include="Microsoft.ML.Vision" Version="3.0.1" /> <PackageReference Include="TorchSharp-cuda-windows" Version="0.102.5" />
执行以下加载Torch模型的代码时:
MLContext mlContext = new MLContext(); ITransformer mlModel = mlContext.Model.Load(MLNetModelPath, out var _);
抛出如下异常:
MissingMethodException: Method not found: '!!0 TorchSharp.ModuleExtensionMethods.to(!!0, Device)'. at Microsoft.ML.TorchSharp.AutoFormerV2.ObjectDetectionTransformer.Create(Microsoft.ML.Runtime.IHostEnvironment, Microsoft.ML.ModelLoadContext)
旧版本包下无此问题,现需排查问题原因及解决方法。
问题原因
- 版本不兼容:
Microsoft.ML.TorchSharp 0.21.1依赖的TorchSharp版本与手动指定的TorchSharp-cuda-windows 0.102.5不匹配。ModuleExtensionMethods.to方法在TorchSharp版本迭代中发生了签名变更或被移除,而ML.NET的TorchSharp绑定库仍在调用旧版本的方法签名。 - 依赖冲突:升级ML.NET相关包后,未同步使用其依赖的TorchSharp版本,导致运行时找不到对应方法。
解决方法
- 移除手动指定的TorchSharp包:删除项目中直接引用的
<PackageReference Include="TorchSharp-cuda-windows" Version="0.102.5" />,让Microsoft.ML.TorchSharp自动引入其依赖的兼容版本TorchSharp包。 - 清理重建项目:
- 执行
dotnet clean命令清除旧编译缓存和包文件; - 删除项目目录下的
bin和obj文件夹,避免残留旧版本程序集; - 执行
dotnet restore和dotnet build命令重新还原依赖并构建项目。
- 执行
- 验证依赖版本:打开项目的
obj/project.assets.json文件,确认TorchSharp版本与Microsoft.ML.TorchSharp要求的版本一致,排除版本不匹配问题。
内容的提问来源于stack exchange,提问作者Max Cat
相关产品推荐
相关产品推荐

