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

Xamarin.Android开启Sdk和用户程序集链接时构造器缺失报错求助

解决Xamarin.Android全链接模式下的序列化异常问题

核心原因

Xamarin的链接器在启用「Sdk and User Assemblies」模式时,会自动移除它判定为“未被使用”的代码,包括类的默认无参构造函数。而你调用的ToObject<T>方法(属于序列化/反序列化操作,比如MongoDB Bson、Json.NET这类库)是通过反射调用类的无参构造函数创建实例的,链接器无法识别这种反射调用,因此移除了构造函数,最终触发异常。

具体修复步骤

1. 显式添加无参构造函数并标记保留

给TableFields类显式添加无参构造函数,同时用特性告知链接器不要移除它。可以使用Xamarin自带的[Preserve]特性,或者对应序列化库的特性:

修改后的模型代码:

// 确保引用包含Preserve特性的程序集,比如Xamarin.Forms/Xamarin.Essentials
using Xamarin.Forms;

internal class DatabaseFields
{
    [Preserve(AllMembers = true)]
    public class TableFields
    {
        // 显式声明无参构造函数
        public TableFields() {}

        public string myString1 { get; set; }
        public string myString2 { get; set; }
    }
}

若项目中找不到Preserve特性,可手动定义:

[AttributeUsage(AttributeTargets.All)]
public sealed class PreserveAttribute : Attribute
{
    public bool AllMembers { get; set; }
    public bool Conditional { get; set; }
}

2. 通过链接器配置文件跳过指定类

如果不想逐个类标记,可在Android项目中添加链接器配置文件,强制保留目标类的所有成员:

  1. 在Android项目中新建Linker.xml文件,将其「生成操作」设置为「LinkDescription」;
  2. 写入以下配置内容:
<linker>
  <assembly fullname="你的程序集名称(如MyApp)">
    <type fullname="MyApp.DatabaseFields+TableFields" preserve="all" />
  </assembly>
</linker>

3. 验证修复

重新编译并启用全链接模式测试,ArgumentException会先消失,连锁触发的TypeInitializationException也会随之解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:33:13