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

Xamarin中Assembly.LoadFile不支持问题修复方案咨询

解决Xamarin AppX环境下Assembly.LoadFile不支持的问题

你遇到的System.NotSupportedException是因为AppX(包括Xamarin UWP这类基于AppX的应用)的沙盒安全机制限制了Assembly.LoadFile方法——这个方法允许加载任意路径的程序集,而AppX环境要求所有加载的程序集必须位于应用的安装目录、应用数据文件夹这类受信任的位置,并且不能直接通过文件路径加载外部未授权的程序集。

下面给你几个可行的修复方案:

方案1:使用Assembly.LoadFrom加载受信任位置的程序集

如果你的MicroChatsTest.dll是应用包的一部分(比如放在项目中,设置为"内容"并随应用部署),或者位于应用的LocalFolder这类可访问目录,可以用Assembly.LoadFrom替代Assembly.LoadFile,代码示例如下:

// 示例:加载安装目录下的程序集
var packageFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;
var dllFile = await packageFolder.GetFileAsync("MicroChatsTest.dll");

// 获取文件路径后加载
var assembly = Assembly.LoadFrom(dllFile.Path);

// 后续类型查找和实例化逻辑不变(建议排除接口本身)
var type = typeof(IUpdate);
var myType = assembly.GetTypes().Where(p => type.IsAssignableFrom(p) && !p.IsInterface).FirstOrDefault();
if (myType == null) throw new Exception("E1234");
var instance = Activator.CreateInstance(myType);

注意:如果你的DLL是用户手动添加到应用数据目录的,需要先通过StorageFolder获取到正确的文件路径,确保应用有访问该路径的权限。

方案2:将插件DLL作为嵌入式资源加载

如果你的插件DLL不需要动态替换,可以把它作为主应用的嵌入式资源打包,然后通过流加载程序集,这样能完全避开路径访问的限制:

  1. 在Xamarin项目中添加MicroChatsTest.dll,右键设置其生成操作为「嵌入式资源」。
  2. 使用以下代码从资源流加载:
// 获取当前程序集(假设DLL嵌入在当前主程序集中)
var currentAssembly = Assembly.GetExecutingAssembly();
// 资源名称格式:[项目命名空间].[文件夹路径].MicroChatsTest.dll
// 比如你的项目命名空间是MyXamarinApp,DLL放在Plugins文件夹下,资源名就是MyXamarinApp.Plugins.MicroChatsTest.dll
using var stream = currentAssembly.GetManifestResourceStream("YourNamespace.MicroChatsTest.dll");
if (stream == null) throw new FileNotFoundException("Embedded DLL not found");

var assembly = Assembly.Load(stream.ToArray());

// 后续类型查找和实例化逻辑同上
var type = typeof(IUpdate);
var myType = assembly.GetTypes().Where(p => type.IsAssignableFrom(p) && !p.IsInterface).FirstOrDefault();
if (myType == null) throw new Exception("E1234");
var instance = Activator.CreateInstance(myType);

关键注意事项

  • 类型一致性:确保IUpdate接口在主应用和插件DLL中的定义完全一致(包括命名空间、成员),否则会出现IsAssignableFrom返回false的情况。
  • 架构匹配:插件DLL的CPU架构(x86/x64/ARM)必须和主应用的部署架构一致,否则加载会失败。
  • 权限限制:AppX环境下无法加载应用沙盒外的任意DLL,所有需要加载的程序集必须在应用的受信任目录内,或者作为嵌入式资源打包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:41:13