【问题标题】:C# PublishTrimmed: how to deal with IL2104 trim warnings in dependenciesC# PublishTrimmed:如何处理依赖项中的 IL2104 修剪警告
【发布时间】:2022-11-04 18:17:24
【问题描述】:

Newtonsoft.Json.dll:错误 IL2104:程序集“Newtonsoft.Json”产生修剪警告。了解更多信息 见https://aka.ms/dotnet-illink/libraries [C:\Users\pclay\scs_link\link\StudioLink\StudioLink.csproj]

我一直在使用Dotnet 7 trimming,但文档没有明确说明如果某些第三方组件不能兼容,如何免除它们的修剪。如何将修剪限制为仅兼容的组件?

【问题讨论】:

    标签: .net


    【解决方案1】:

    TL;DR:你不能。


    长版:

    该警告源于第三方程序集,但与如何通过不修剪该程序集本身无法解决问题有关。

    在这种情况下,它与 Newtonsoft.Json 如何在序列化数据中使用反射有关。 Newtonsoft API 没有为此正确注释,并且 ILLinker 检测到它在某些情况下使用了不受保护的反射。保护是通过 API 的部分属性来完成的(尤其是类型参数和非具体类型,objects 和接口)。

    这意味着,您的应用程序可能有一个 MyCertainDTO 类型,您希望使用 Newtonsoft 对其进行序列化。您可以通过向项目文件的PropertyGroup 添加一个属性来“root”Newtonsoft.Json.dll,如下所示:<TrimmerRootAssembly Include="Microsoft.AspNetCore.Components" />。但这不会阻止链接器丢弃您的 MyCertainDTO 类型,因为那不在 Newtonsoft 的程序集中!

    所以警告本质上意味着:

    • 要么告诉第三方包的提供者正确注释其包以进行修剪,要么,
    • 如果您确定不会出现问题(例如,因为您确保修剪器不会修剪您的代码),您可以抑制该问题在你的代码中通过使用某个属性(我不会在这里命名它,因为只有当你真的知道你在做什么时才应该使用它)。不过,这不会阻止第三方警告,而且我不确定这是否可能。

    您可以通过设置<TrimMode>partial</TrimMode> 相对安全地将链接器设置为仅修剪兼容修剪的程序集。这也不会关闭警告,但它会在您的程序集中保留更多类型和成员“只是为了安全”。如果你只是想让警告消失,你可以<SuppressTrimAnalysisWarnings>true</SuppressTrimAnalysisWarnings>,但这并不能真正解决除了警告没有出现之外的任何问题。它们还在那里,只是你看不到它们。


    就是这样:您可以抑制这些警告,但本质上,您无法解决问题。一种解决方法是您实现一个包装器,抑制底层问题并直接使用您的包装器(然后被认为是修剪安全的)。但是正确和真正解决问题的唯一方法是包的作者正确地注释他们的程序集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-22
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多