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

.NET WebAssembly发布裁剪控制与Newtonsoft.Json反射兼容问题

Avalonia WASM + .NET 8 保留裁剪兼容Newtonsoft.Json的解决方案

针对你遇到的裁剪导致Newtonsoft.Json反射找不到构造函数、关闭裁剪又出现Mono版本不兼容的问题,给出以下可行方案:

1. 精准配置裁剪规则文件

创建linker.xml文件直接指定需要保留的类型,比TrimmerRootAssembly更精准,避免过度裁剪:

<linker>
  <!-- 保留你的共享库中JSON实体类的所有成员 -->
  <assembly fullname="你的共享程序集名称">
    <!-- 单个类配置 -->
    <type fullname="你的命名空间.目标实体类" preserve="all" />
    <!-- 批量配置命名空间下所有类 -->
    <type fullname="你的命名空间.*" preserve="all" />
  </assembly>
  <!-- 强制保留Newtonsoft.Json核心反射依赖组件 -->
  <assembly fullname="Newtonsoft.Json">
    <type fullname="Newtonsoft.Json.Serialization.DefaultContractResolver" preserve="all" />
    <type fullname="Newtonsoft.Json.Serialization.JsonSerializerInternalReader" preserve="all" />
    <type fullname="Newtonsoft.Json.Serialization.JsonSerializerInternalWriter" preserve="all" />
  </assembly>
</linker>

在项目文件中引入该配置:

<ItemGroup>
  <LinkerDescriptor Include="linker.xml" />
</ItemGroup>

2. 优化DynamicallyAccessedMembers特性使用

不要只在实体类上标注,在反序列化的调用方法上添加特性,明确告诉裁剪器此处需要反射访问:

[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(你的实体类))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(另一实体类))]
public void LoadJson(string jsonContent)
{
    var result = JsonConvert.DeserializeObject<你的实体类>(jsonContent);
}

如果是泛型反序列化场景,可在项目文件中批量添加程序集级特性:

<ItemGroup>
  <AssemblyAttribute Include="System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute">
    <_Parameter1>System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All</_Parameter1>
    <_Parameter2>你的命名空间.目标实体类</_Parameter2>
  </AssemblyAttribute>
</ItemGroup>

3. 调整.NET 8 WASM裁剪参数

在项目文件中设置更宽松的裁剪模式,保留反射必要的基础支持:

<PropertyGroup>
  <PublishTrimmed>true</PublishTrimmed>
  <TrimMode>partial</TrimMode>
  <TrimmerDefaultAction>link</TrimmerDefaultAction>
  <TrimEnableReflection>true</TrimEnableReflection>
</PropertyGroup>

4. 解决关闭裁剪时的Mono版本异常

若关闭PublishTrimmed后出现System.Private.CoreLib.dll同步异常:

  • 彻底清理项目的bin和obj文件夹,重新生成发布
  • 确保Visual Studio 2022安装了最新的.NET 8 WASM工作负载
  • 检查GitHub Pages部署的所有文件(如dotnet.js、dotnet.runtime.js)是否为最新版本,清除浏览器缓存后测试

5. 验证裁剪结果

用dotnet trim analyze工具检查程序集裁剪情况,确认目标类型未被误删:

dotnet trim analyze 你的项目程序集.dll --verbose

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 10:25:15