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

UWP启用.NET Native工具链时Release模式下Assembly.Load()失效

解决UWP Release模式下.NET Native编译导致动态加载DLL失败的问题

这个问题我帮不少开发者排查过,核心矛盾就在于Debug和Release模式下UWP的编译机制差异——尤其是.NET Native的AOT(提前编译)优化会破坏动态加载的逻辑。

为什么Debug正常,Release就报错?

  • Debug模式下UWP用的是JIT(即时编译),程序集的元数据、结构都完整保留,Assembly.Load()能轻松找到AppX文件夹里的DLL并加载。
  • 但启用.NET Native编译Release包时,它会把所有依赖编译成本地机器码,还会做死代码移除、类型重命名、元数据裁剪等激进优化。如果动态加载的DLL没被明确标记为需要保留,.NET Native可能会直接忽略它,或者编译后程序集的名称/结构发生变化,导致Assembly.Load()抛出FileNotFoundException。

具体解决方案(按优先级排序)

1. 显式让.NET Native纳入动态DLL的编译流程

编辑你的UWP主项目的.csproj文件,添加以下节点,告诉编译器这个DLL是应用的一部分,不能被优化掉:

<ItemGroup>
  <NativeReferences Include="YourDynamicLibrary.dll">
    <IsImplicitlyReferenced>false</IsImplicitlyReferenced>
    <Implementation>YourDynamicLibrary.dll</Implementation>
  </NativeReferences>
</ItemGroup>

替换YourDynamicLibrary.dll为你实际要加载的DLL名称。

2. 改用Assembly.LoadFrom()替代Assembly.Load()

Assembly.Load()依赖程序集的强名称/全名查找,但.NET Native编译后这些信息可能被修改。直接用文件路径加载更可靠:

using System.IO;
using Windows.ApplicationModel;

// 获取AppX文件夹下DLL的完整路径
var dllFullPath = Path.Combine(Package.Current.InstalledLocation.Path, "YourDynamicLibrary.dll");
var targetAssembly = Assembly.LoadFrom(dllFullPath);

3. 确保DLL被正确打包到Release AppX中

检查动态DLL的属性:

  • 在解决方案资源管理器中选中DLL,设置复制到输出目录为「始终复制」或「如果较新则复制」。
  • 在主项目对该DLL的引用中,把复制本地设置为true,确保Release编译时它会被打包进AppX文件夹。

4. 通过rd.xml保留DLL的完整元数据

如果上面的方法都不生效,可以修改项目中的Default.rd.xml文件,强制.NET Native保留目标DLL的所有元数据:

<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
  <Application>
    <!-- 替换为你的动态DLL的程序集名称 -->
    <Assembly Name="YourDynamicLibrary" Dynamic="Required All"/>
  </Application>
</Directives>

这个方案会禁用该DLL的所有.NET Native优化,可能导致应用体积增大,建议仅作为临时兜底方案。

总结

本质上就是要让.NET Native「感知」到这个动态加载的DLL是应用的必要组成部分,不能被随意优化或忽略。按上面的步骤逐一排查,基本都能解决FileNotFoundException的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:39:31