运行应用时触发System.TypeLoadException:无法加载OpenTelemetry指定类型
问题解决:OpenTelemetry类型加载异常
环境信息
包引用
<PackageReference Include="OpenTelemetry.Exporter.Jaeger" Version="1.4.0-beta.2" /> <PackageReference Include="OpenTelemetry.Exporter.Prometheus" Version="1.2.0-rc5"/> <PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.0.0-rc9.8" /> <PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.0.0-rc9.8" /> <PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.0.0-rc9.8" />
Program.cs 代码片段
builder.Services.AddOpenTelemetryMetrics(b => { b.AddPrometheusExporter(); b.AddMeter(TelemetryConstants.MyAppSource); b.SetResourceBuilder(resource); b.AddHttpClientInstrumentation(); b.AddAspNetCoreInstrumentation(); });
错误信息
调用 app.UseOpenTelemetryPrometheusScrapingEndpoint(); 时抛出异常:
System.TypeLoadException: 'Could not load type 'System.ServiceProviderExtensions' from assembly 'OpenTelemetry, Version=1.0.0.0, Culture=neutral, PublicKeyToken=7bd6737fe5b67e3c'.'
解决方案
该异常由OpenTelemetry相关包版本不兼容导致:
- 你使用的
OpenTelemetry.Exporter.Prometheus版本为1.2.0-rc5,而其他核心依赖包(如Extensions.Hosting、Instrumentation系列)均为1.0.0-rc9.8,版本跨度大导致内部依赖类型不匹配。
具体修复步骤:
- 统一所有OpenTelemetry包版本:
- 若继续使用RC版本,将
OpenTelemetry.Exporter.Prometheus降级至1.0.0-rc9.8,与其他包版本保持一致; - 推荐切换到稳定版,例如统一使用1.5.1版本:
<PackageReference Include="OpenTelemetry.Exporter.Jaeger" Version="1.5.1" /> <PackageReference Include="OpenTelemetry.Exporter.Prometheus" Version="1.5.1"/> <PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.5.1" /> <PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.5.1" /> <PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.5.1" />
- 若继续使用RC版本,将
- 删除项目的
bin、obj目录,清理NuGet缓存后重新构建项目; - 确认
UseOpenTelemetryPrometheusScrapingEndpoint()调用方式正确,稳定版本中该方法使用逻辑无变更。
内容的提问来源于stack exchange,提问作者Sunilkumar Mandati
相关产品推荐
相关产品推荐

