当应用程序修剪时,如何将整个程序集标记为动态访问?

7

使用.NET 5,我们可以通过削减项目大小来减少其占用空间。如果我们知道将通过反射访问Type,我们可以将其标记为动态访问:

public void DoSomethingReflective<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] T>();

但是否有一种方法可以将整个程序集标记为动态访问?

public void DoSomethingReflective(Assembly assembly);
1个回答

3

应用程序修剪(Application Trimming)在.Net 5中得到了扩展,提供了更细粒度的控制,以防止隐式危险的处理。

虽然这些属性是针对特定情景的(并且很方便),但目前它们缺乏支持复杂情况的能力。尽管如此,我的直觉是未来这个功能集会扩展。不过,目前您可以使用基于XML的配置文件,其具有广泛的复杂选项和用例。

基本上,它们可以分为以下几类:

  • 保留
  • 外部归因
  • 功能切换

关于保留(即您想要的内容),您需要将TrimmerRootDescriptor标签添加到项目文件中。

<ItemGroup>
   <TrimmerRootDescriptor Include="Whatever.xml" />
</ItemGroup>

那么在配置文件中,只需要将linker设置为通过FullName标记表示的assembly即可。

<linker>
  <assembly fullname="SomeAssembly" preserve="all" />
</linker>

或者使用完全限定名称。
<linker>
  <assembly fullname="SomeAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
</linker>

如果一个装配标签下有类型,除非在装配级别指定 preserve=all,否则仅会对列出的类型和成员进行保护标记。
<assembly fullname="AssemblyA">
   <type fullname="AssemblyA.One" preserve="all" />
   <type fullname="AssemblyA.Two" />

相反,如果类型没有保留属性且不列出任何子级,则其所有成员都将被标记为保留。

其他资源

自定义 .NET 5 中的修剪

保留

修剪器将自动包含它认为应用程序可以访问的所有代码。使用 XML 文件的保留方案是告诉修剪器“保留”代码,即使它认为该代码未被使用也不会删除。这对于通过反射发现和调用的代码非常有用。

...

当程序集、类型或成员在 xml 中列出时,默认操作是保留,这意味着无论修剪器是否认为它们被使用,它们都将保存在输出中。保留是累加的,它会告诉修剪器应该保留哪些额外的代码,即使它认为某个类型或成员不需要也会包括它们,基于保留标记它们可能不会被包含。


1
谢谢,非常有用。这并不能让我们轻而易举地提供一个依赖于程序集级别反射的NuGet包,但是我们可以在文档中包含如何配置项目以适应这种情况。 - Gene
1
@Gene 是的,那大概是你唯一的选择了。祝你好运。 - TheGeneral

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接