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)
应用程序修剪已在.Net 5中得到扩展,使您可以更细粒度地控制可能存在隐式危险的进程。
\n尽管这些属性是有针对性的(而且方便),但现阶段它们缺乏对更复杂场景的支持。不过,我的直觉是这个功能集未来将会扩展。但是,您现在可以使用基于 XML 的配置文件,其中考虑了各种复杂的选项和用例。
\n基本上,它们分为以下几部分
\n关于坚持(这就是您想要的),您可以将标签添加TrimmerRootDescriptor到项目文件中
<ItemGroup>\n <TrimmerRootDescriptor Include="Whatever.xml" />\n</ItemGroup>\nRun Code Online (Sandbox Code Playgroud)\n然后在配置文件中,只需通过 FullName 标签设置linker程序集即可
<linker>\n <assembly fullname="SomeAssembly" preserve="all" />\n</linker>\nRun Code Online (Sandbox Code Playgroud)\n或完全限定名称
\n<linker>\n <assembly fullname="SomeAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">\n</linker>\nRun Code Online (Sandbox Code Playgroud)\n如果程序集标签下有类型,则只有列出的类型和成员才会被标记为保存,除非preserve=all在程序集级别指定。
<assembly fullname="AssemblyA">\n <type fullname="AssemblyA.One" preserve="all" />\n <type fullname="AssemblyA.Two" />\nRun Code Online (Sandbox Code Playgroud)\n相反,如果类型没有\xe2\x80\x99t 具有保留属性,并且它没有\xe2\x80\x99t 列出任何子级,则其所有成员都将被标记为保留。
\n其他资源
\n\n\n\n保存
\n修剪器将自动包含它认为应用程序可以访问的所有代码。使用 XML 文件的保存方案是告诉修剪器保留 xe2x80x9c 代码而不是删除它,即使它不认为它已被使用。这对于通过反射发现和调用的代码来说非常有用。
\n...
\n当 xml 中列出程序集、类型或成员时,默认操作是保留,这意味着无论修剪器是否认为它们已被使用,它们都将保留在输出中。保留是附加的,它会告诉修剪器它认为不需要的额外代码应该保留,如果它认为需要类型或成员,那么它将包含它,即使它不会\n根据保存标签包含。
\n
| 归档时间: |
|
| 查看次数: |
1447 次 |
| 最近记录: |