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不需要动态替换,可以把它作为主应用的嵌入式资源打包,然后通过流加载程序集,这样能完全避开路径访问的限制:
- 在Xamarin项目中添加
MicroChatsTest.dll,右键设置其生成操作为「嵌入式资源」。 - 使用以下代码从资源流加载:
// 获取当前程序集(假设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
相关产品推荐
相关产品推荐

