类库SendEmail方法通过接口调用报MissingMethodException,主项目运行正常
问题分析与解决方案
可能原因
- Microsoft.Graph 包版本不匹配:类库与ASP.NET Core主项目引用的
Microsoft.Graph或Microsoft.Graph.Core包版本不一致。控制器直接使用主项目的包版本可正常运行,但类库依赖的版本与主项目加载的版本存在方法签名差异,导致运行时找不到PostAsync()方法。 - 绑定重定向失效:.NET 6虽自动处理绑定重定向,但版本冲突时可能未生成正确的绑定规则,导致加载错误版本的程序集。
- 构建缓存残留:旧的程序集缓存未清理,运行时加载了过时的
Microsoft.Graph程序集。 - 依赖传递异常:类库的依赖未正确传递到主项目,或主项目的包版本覆盖了类库的依赖版本。
解决步骤
1. 统一Graph包版本
- 检查类库和主项目的
csproj文件,确保Microsoft.Graph和Microsoft.Graph.Core的引用版本完全一致。 - 推荐在解决方案级别统一管理版本:在根目录创建
Directory.Packages.props文件,强制所有项目使用相同版本的包:
<Project> <PropertyGroup> <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally> </PropertyGroup> <ItemGroup> <PackageVersion Include="Microsoft.Graph" Version="4.56.0" /> <PackageVersion Include="Microsoft.Graph.Core" Version="2.0.14" /> </ItemGroup> </Project>
2. 清理缓存并重建
- 执行
dotnet clean清理解决方案,手动删除所有项目的bin和obj文件夹。 - 运行
dotnet build重新构建整个解决方案,确保生成最新的程序集。
3. 验证依赖树
- 在主项目目录下运行
dotnet list package,查看Microsoft.Graph的实际版本,确认无冲突版本被引入。 - 若存在版本冲突,优先通过统一包版本解决,而非调整依赖传递规则。
4. 检查程序集加载情况
- 在主项目的
Program.cs中添加日志代码,查看运行时加载的Microsoft.Graph版本:
AppDomain.CurrentDomain.AssemblyLoad += (sender, args) => { if (args.LoadedAssembly.FullName.Contains("Microsoft.Graph")) { Console.WriteLine($"Loaded Graph assembly: {args.LoadedAssembly.FullName}"); } };
- 启动应用后查看控制台输出,若加载的版本与项目引用不一致,找到并删除残留的旧版本程序集(通常在发布目录或缓存目录)。
5. 确认目标框架一致性
- 检查类库项目的
csproj文件,确保<TargetFramework>设置为net6.0,与主项目完全一致。
内容的提问来源于stack exchange,提问作者MatrixRonny
相关产品推荐
相关产品推荐

