You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在Blazor WebAssembly项目中禁用Runtime relinking?插件反射疑问

关于Runtime Relinking对反射插件的影响及规避方案

问题答案

Runtime Relinking会导致插件中的部分类型或方法无法使用。因为Runtime Relinking的核心逻辑是在发布阶段移除未被代码直接引用的冗余代码,而通过反射访问的插件成员属于间接引用,链接器无法自动识别这些依赖,会将其判定为未使用代码并移除,最终引发反射调用时的类型或方法找不到的异常。

规避方案

1. 保留整个插件程序集

通过链接器配置文件(Linker.xml)指定保留目标插件的全部内容,阻止链接器对其进行裁剪:

<linker>
  <assembly fullname="你的插件程序集名称">
    <type fullname="*" preserve="all" />
  </assembly>
</linker>

将配置文件放在项目根目录,并确保在.csproj中正确引用:

<ItemGroup>
  <LinkerDescriptor Include="Linker.xml" />
</ItemGroup>

2. 精准保留特定类型/方法

如果不需要保留整个插件程序集,可在配置文件中明确指定需要保留的类型、方法或字段:

<linker>
  <assembly fullname="你的插件程序集名称">
    <type fullname="你的插件命名空间.目标类型">
      <method name="目标方法名" />
      <field name="目标字段名" />
    </type>
  </assembly>
</linker>

这种方式能最小化发布体积,但需要准确梳理所有反射用到的成员。

3. 使用[DynamicDependency]特性

在项目中调用反射的代码处,添加[DynamicDependency]特性,告知链接器需要保留的依赖:

using System.Diagnostics.CodeAnalysis;

[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(你的插件类型))]
public void LoadAndInvokePlugin()
{
    // 反射加载并调用插件的代码逻辑
}

该特性支持指定需要保留的成员类型(如构造函数、方法、属性等),无需额外维护配置文件。

4. 禁用插件程序集的链接优化

在项目文件(.csproj)中添加配置,直接将插件程序集标记为链接器的根程序集,禁止对其进行裁剪:

<ItemGroup>
  <TrimmerRootAssembly Include="你的插件程序集名称" />
</ItemGroup>

内容的提问来源于stack exchange,提问作者yueyinqiu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 12:54:18