在Xamarin.iOS中使用HttpPipelinePolicy时触发System.TypeLoadException
Xamarin.iOS中Azure Blob SDK自定义HttpPipelinePolicy引发TypeLoadException的解决办法
问题场景
在Xamarin.iOS环境下使用Azure Blob存储SDK,自定义继承自HttpPipelinePolicy的AuthTokenHttpPipelinePolicy类(已实现所有方法),调用blobClientOptions.AddPolicy(policy, HttpPipelinePosition.PerRetry)时抛出System.TypeLoadException,异常详情:
Caught an exception = System.TypeLoadException: Type AuthTokenHttpPipelinePolicy has invalid vtable method slot 4 with method none
解决步骤
1. 严格匹配基类方法签名
检查AuthTokenHttpPipelinePolicy中所有重写方法的签名,确保和HttpPipelinePolicy基类完全一致,包括:
- 方法名称、返回值类型(比如
ValueTask而非Task) - 参数列表(
HttpPipelineMessage、ReadOnlyMemory<HttpPipelinePolicy>) - 修饰符(必须使用
override关键字)
示例正确的方法实现结构:
public class AuthTokenHttpPipelinePolicy : HttpPipelinePolicy { public override async ValueTask ProcessAsync(HttpPipelineMessage message, ReadOnlyMemory<HttpPipelinePolicy> pipeline) { // 自定义鉴权逻辑,比如添加请求头 message.Request.Headers.Add("Authorization", "Bearer your-token"); // 执行后续管道策略 await pipeline[0].ProcessAsync(message, pipeline.Slice(1)); } public override void Process(HttpPipelineMessage message, ReadOnlyMemory<HttpPipelinePolicy> pipeline) { // 同步方法实现,若无需同步支持可抛出NotImplementedException ProcessAsync(message, pipeline).AsTask().Wait(); } }
2. 添加Preserve特性避免链接器优化
Xamarin.iOS的链接器会默认移除未被直接引用的代码,可能导致基类方法的vtable条目丢失。在自定义类上添加[Preserve]特性:
[Preserve(AllMembers = true)] public class AuthTokenHttpPipelinePolicy : HttpPipelinePolicy { // 方法实现... }
3. 验证Azure SDK版本兼容性
部分较新的Azure.Storage.Blobs SDK版本可能对Xamarin.iOS的AOT编译支持存在问题,尝试降级到稳定兼容版本(如12.14.x系列),避免使用预览版或最新未验证版本。
4. 调整项目编译设置
在Xamarin.iOS项目的编译选项中:
- 禁用"Link All Assemblies",改为"Link Framework SDKs Only",减少不必要的代码裁剪
- 确保项目目标框架为iOS 14及以上版本,提升兼容性
内容的提问来源于stack exchange,提问作者bonnie m
相关产品推荐
相关产品推荐

