首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在应用程序修整时将整个程序集标记为动态访问

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

Stack Overflow用户
提问于 2020-11-26 07:57:04
回答 1查看 511关注 0票数 7

使用.NET 5,我们可以纵倾我们的项目,以减少它的占用。如果我们知道将通过反射访问Type,则可以将其标记为动态访问:

代码语言:javascript
运行
复制
public void DoSomethingReflective<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] T>();

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

代码语言:javascript
运行
复制
public void DoSomethingReflective(Assembly assembly);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-26 08:33:59

应用程序修整已经在.Net 5中进行了扩展,并使您能够更细粒度地控制什么可能是隐式危险的过程。

虽然这些属性是有针对性的(而且很方便),但在现阶段,它们缺乏对更复杂场景的支持。不过,我的直觉是,这个功能集将扩展未来。但是,您现在可以使用基于XML的配置文件,这些配置文件具有广泛的复杂选项和用例。

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

  • 保藏
  • 外部归属
  • 特征开关

关于持之以恒(这正是您想要的),您可以将TrimmerRootDescriptor标记添加到项目文件中。

代码语言:javascript
运行
复制
<ItemGroup>
   <TrimmerRootDescriptor Include="Whatever.xml" />
</ItemGroup>

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

代码语言:javascript
运行
复制
<linker>
  <assembly fullname="SomeAssembly" preserve="all" />
</linker>

或者一个完全限定的名字

代码语言:javascript
运行
复制
<linker>
  <assembly fullname="SomeAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
</linker>

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

代码语言:javascript
运行
复制
<assembly fullname="AssemblyA">
   <type fullname="AssemblyA.One" preserve="all" />
   <type fullname="AssemblyA.Two" />

相反,如果类型没有保存属性,并且没有列出任何子元素,那么它的所有成员都将被标记为保存。

附加资源

在.NET 5中自定义裁剪

Preservation 修整器将自动包含它认为应用程序可以达到的所有代码。使用XML文件的保存场景是告诉修整器“保存”代码,而不是删除它,即使它认为它没有被使用。这对于通过反射发现和调用的代码来说是很好的。 ..。 当xml中列出程序集、类型或成员时,默认操作是保存,这意味着无论裁剪器是否认为使用它们,它们都将保留在输出中。保存是可加性的,它会告诉修整器应该保留它认为不需要的额外代码,如果它认为需要一个类型或成员,那么它就会包含它,即使它不会基于保存标记包含它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65017997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档