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

.NET7与Avalonia UI v11程序集剪裁相关问题求助

.NET7程序集剪裁问题解决方案

问题1:ICollectionView列表项文本缺失

核心原因

程序集剪裁工具移除了FileItem类的属性访问器或默认ToString()方法,导致WPF无法获取用于显示的文本内容。

解决方案

  1. 显式绑定属性+保留特性
    确保列表控件的DisplayMemberPath设置为Name(或目标属性),同时给FileItem类添加特性以保留属性成员:
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)]
public class FileItem
{
    // 原有构造函数、Name/Path属性不变
}
  1. 重写ToString()方法
    若列表未设置显式绑定,默认会调用ToString(),显式重写该方法可避免被剪裁工具移除:
public class FileItem
{
    // 原有构造函数、Name/Path属性不变
    
    public override string ToString() => Name;
}
  1. 项目文件添加剪裁保留规则
    在项目的.csproj文件中添加配置,强制保留FileItem类的必要成员:
<ItemGroup>
  <TrimmerRootDescriptor Include="FileItemTrimmer.xml" />
</ItemGroup>

对应的FileItemTrimmer.xml内容:

<linker>
  <assembly fullname="你的程序集名称">
    <type fullname="你的命名空间.FileItem" preserve="publicProperties" />
  </assembly>
</linker>

问题2:SettingsPlaylistItem序列化提示缺少构造函数

核心原因

剪裁工具移除了SettingsPlaylistItem的无参构造函数或序列化所需成员,且[DynamicallyAccessedMembers]特性未被序列化器正确识别。

解决方案

  1. 使用JsonSerializable上下文(System.Text.Json)
    创建序列化上下文,让剪裁工具自动保留序列化所需的所有成员:
using System.Text.Json.Serialization;

[JsonSerializable(typeof(List<SettingsPlaylistItem>))]
public partial class SettingsJsonSerializerContext : JsonSerializerContext { }

序列化时改用该上下文:

var json = JsonSerializer.Serialize(Playlists, SettingsJsonSerializerContext.Default.ListSettingsPlaylistItem);
  1. 项目文件添加精确剪裁保留规则
    在.csproj中添加配置,强制保留SettingsPlaylistItem的所有必要成员:
<ItemGroup>
  <TrimmerRootDescriptor Include="SettingsPlaylistItemTrimmer.xml" />
</ItemGroup>

对应的SettingsPlaylistItemTrimmer.xml内容:

<linker>
  <assembly fullname="你的程序集名称">
    <type fullname="你的命名空间.SettingsPlaylistItem" preserve="all" />
  </assembly>
</linker>
  1. 给构造函数添加Preserve特性
    若SettingsPlaylistItem的无参构造被剪裁,直接给构造函数添加特性标记:
public class SettingsPlaylistItem
{
    [System.Diagnostics.CodeAnalysis.Preserve]
    public SettingsPlaylistItem() { }
    
    // 其他成员代码
}
  1. 修正特性应用范围
    确保[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]同时应用到包含Playlists属性的类上:
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)]
public class YourSettingsClass
{
    public List<SettingsPlaylistItem> Playlists { get; set; } = new();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:23:11