应用程序修剪时将整个程序集标记为动态访问

Gen*_*ene 7 .net c# reflection msbuild

借助 .NET 5,我们可以修剪我们的项目以减少其占用空间。如果我们知道我们将Type通过反射访问,我们可以将其标记为动态访问:

public void DoSomethingReflective<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] T>();
Run Code Online (Sandbox Code Playgroud)

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

public void DoSomethingReflective(Assembly assembly);
Run Code Online (Sandbox Code Playgroud)

AAA*_*ddd 3

应用程序修剪已在.Net 5中得到扩展,使您可以更细粒度地控制可能存在隐式危险的进程。

\n

尽管这些属性是有针对性的(而且方便),但现阶段它们缺乏对更复杂场景的支持。不过,我的直觉是这个功能集未来将会扩展。但是,您现在可以使用基于 XML 的配置文件,其中考虑了各种复杂的选项和用例。

\n

基本上,它们分为以下几部分

\n
    \n
  • 保存
  • \n
  • 外部归因
  • \n
  • 功能开关
  • \n
\n

关于坚持(这就是您想要的),您可以将标签添加TrimmerRootDescriptor到项目文件中

\n
<ItemGroup>\n   <TrimmerRootDescriptor Include="Whatever.xml" />\n</ItemGroup>\n
Run Code Online (Sandbox Code Playgroud)\n

然后在配置文件中,只需通过 FullName 标签设置linker程序集即可

\n
<linker>\n  <assembly fullname="SomeAssembly" preserve="all" />\n</linker>\n
Run Code Online (Sandbox Code Playgroud)\n

或完全限定名称

\n
<linker>\n  <assembly fullname="SomeAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">\n</linker>\n
Run Code Online (Sandbox Code Playgroud)\n

如果程序集标签下有类型,则只有列出的类型和成员才会被标记为保存,除非preserve=all在程序集级别指定。

\n
<assembly fullname="AssemblyA">\n   <type fullname="AssemblyA.One" preserve="all" />\n   <type fullname="AssemblyA.Two" />\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
\n

其他资源

\n

在 .NET 5 中自定义修剪

\n
\n

保存

\n

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

\n

...

\n

当 xml 中列出程序集、类型或成员时,默认操作是保留,这意味着无论修剪器是否认为它们已被使用,它们都将保留在输出中。保留是附加的,它会告诉修剪器它认为不需要的额外代码应该保留,如果它认为需要类型或成员,那么它将包含它,即使它不会\n根据保存标签包含。

\n
\n