.NET7与Avalonia UI v11程序集剪裁相关问题求助
.NET7程序集剪裁问题解决方案
问题1:ICollectionView列表项文本缺失
核心原因
程序集剪裁工具移除了FileItem类的属性访问器或默认ToString()方法,导致WPF无法获取用于显示的文本内容。
解决方案
- 显式绑定属性+保留特性
确保列表控件的DisplayMemberPath设置为Name(或目标属性),同时给FileItem类添加特性以保留属性成员:
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)] public class FileItem { // 原有构造函数、Name/Path属性不变 }
- 重写ToString()方法
若列表未设置显式绑定,默认会调用ToString(),显式重写该方法可避免被剪裁工具移除:
public class FileItem { // 原有构造函数、Name/Path属性不变 public override string ToString() => Name; }
- 项目文件添加剪裁保留规则
在项目的.csproj文件中添加配置,强制保留FileItem类的必要成员:
<ItemGroup> <TrimmerRootDescriptor Include="FileItemTrimmer.xml" /> </ItemGroup>
对应的FileItemTrimmer.xml内容:
<linker> <assembly fullname="你的程序集名称"> <type fullname="你的命名空间.FileItem" preserve="publicProperties" /> </assembly> </linker>
问题2:SettingsPlaylistItem序列化提示缺少构造函数
核心原因
剪裁工具移除了SettingsPlaylistItem的无参构造函数或序列化所需成员,且[DynamicallyAccessedMembers]特性未被序列化器正确识别。
解决方案
- 使用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);
- 项目文件添加精确剪裁保留规则
在.csproj中添加配置,强制保留SettingsPlaylistItem的所有必要成员:
<ItemGroup> <TrimmerRootDescriptor Include="SettingsPlaylistItemTrimmer.xml" /> </ItemGroup>
对应的SettingsPlaylistItemTrimmer.xml内容:
<linker> <assembly fullname="你的程序集名称"> <type fullname="你的命名空间.SettingsPlaylistItem" preserve="all" /> </assembly> </linker>
- 给构造函数添加Preserve特性
若SettingsPlaylistItem的无参构造被剪裁,直接给构造函数添加特性标记:
public class SettingsPlaylistItem { [System.Diagnostics.CodeAnalysis.Preserve] public SettingsPlaylistItem() { } // 其他成员代码 }
- 修正特性应用范围
确保[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
相关产品推荐
相关产品推荐

