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

Xamarin iOS链接时遇System.ReadOnlyMemory引用解析错误求助

解决Xamarin iOS链接时MT2101错误(SignalR版本依赖冲突)

问题场景

链接Xamarin iOS应用时触发以下错误:

MTOUCH : error MT2101: Can't resolve the reference 'System.ReadOnlyMemory`1<System.Byte> Microsoft.AspNetCore.SignalR.Protocol.HandshakeProtocol::SuccessHandshakeData', referenced from the method 'System.Void Microsoft.AspNetCore.SignalR.HubConnectionContext/<WriteHandshakeResponseAsync>d__50::MoveNext()' in 'Microsoft.AspNetCore.SignalR.Common, Version=1.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'.

应用在“不链接”模式下可正常运行,但必须使用“仅链接框架SDK”模式才能部署到App Store。尝试过--linkskip参数、添加Preserve特性、显式引用相关类型、清理重建等操作均无效,最终排查出核心原因:项目同时引用了Microsoft.AspNetCore.SignalR 1.1.0(依赖Microsoft.AspNetCore.SignalR.Common 1.1.0)和Microsoft.AspNetCore.SignalR.Client 5.0.8(依赖Microsoft.AspNetCore.SignalR.Common 5.0.8),两个版本的Common库存在破坏性变更,链接器处理时仅保留一个版本,导致引用缺失。

解决方案

1. 统一SignalR相关包版本(优先推荐)

版本不一致是问题根源,最稳妥的方式是将服务端和客户端包统一到同一版本:

  • 若项目兼容,升级Microsoft.AspNetCore.SignalR到5.0.8版本,与客户端版本匹配;
  • 若项目只能使用1.1.0版本的SignalR,降级Microsoft.AspNetCore.SignalR.Client到1.1.0版本。

操作步骤:

  • 在NuGet包管理器中卸载所有Microsoft.AspNetCore.SignalR相关包;
  • 重新安装同版本的Microsoft.AspNetCore.SignalR和Microsoft.AspNetCore.SignalR.Client;
  • 清理项目的obj/和bin/文件夹后重新构建。

2. 强制程序集版本绑定(兼容场景备选)

若确实无法统一版本,可通过程序集绑定重定向强制运行时使用指定版本的Microsoft.AspNetCore.SignalR.Common:

  • 在项目的配置文件(如App.config)中添加以下配置:
    <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
          <assemblyIdentity name="Microsoft.AspNetCore.SignalR.Common" publicKeyToken="adb9793829ddae60" culture="neutral" />
          <!-- 重定向到你希望使用的版本,示例为5.0.8.0 -->
          <bindingRedirect oldVersion="0.0.0.0-5.0.8.0" newVersion="5.0.8.0" />
        </dependentAssembly>
      </assemblyBinding>
    </runtime>
    
  • 注意:此方式存在兼容性风险,不同版本的Common库可能有API差异,需完成全面测试后再部署。

3. 优化链接器策略(配合版本统一使用)

版本统一后若仍有链接问题,可调整链接器规则:

  • 在Xamarin iOS项目的“Additional mtouch arguments”中添加:
    --linkskip Microsoft.AspNetCore.SignalR.Common
    
  • 在Application.Main所在的类文件中添加Preserve特性:
    [assembly: Preserve(typeof(Microsoft.AspNetCore.SignalR.Protocol.HandshakeProtocol), AllMembers = true)]
    

内容的提问来源于stack exchange,提问作者code65

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:56:10