You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 02:15:38