.NET混合框架下调用GetAccessControl报MissingMethodException异常排查
根因分析
该报错由混合框架调用的运行时类型不匹配导致:DirectoryInfo.GetAccessControl()实例方法是.NET Framework专属API,.NET Core/.NET 5+ 运行时下的DirectoryInfo类型不包含该实例方法。即使权限逻辑封装在.NET Framework 4.8类库中,由于入口主项目为.NET Core,运行时会优先加载.NET Core版本的基础类库实现,因此触发方法找不到的异常。
解决方案
方案1:修改权限逻辑适配.NET Core运行时(推荐,无需调整现有框架架构)
- 给.NET Framework类库和.NET Core主项目都安装
System.Security.AccessControlNuGet包,该包提供了跨.NET框架版本兼容的ACL操作API。 - 调整
SetFullPermission方法,确保引入对应命名空间后调用扩展方法实现相同逻辑,修改后代码如下:
using System.Security.AccessControl; // 必须引入该命名空间才可调用跨框架的ACL扩展方法 public static void SetFullPermission(string path, string domainAccount) { NTAccount ntaccount = new NTAccount("my_domain", domainAccount); DirectoryInfo dirInfo = new DirectoryInfo(path); // 此处实际调用NuGet包提供的扩展方法,兼容.NET Framework和.NET Core运行时 DirectorySecurity ds = dirInfo.GetAccessControl(); ds.AddAccessRule(new FileSystemAccessRule( ntaccount, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow)); ds.SetAccessRuleProtection(true, false); // 禁用继承并清除所有继承权限 dirInfo.SetAccessControl(ds); }
方案2:统一框架版本
如果业务允许调整主项目配置,直接将.NET Core主项目的目标框架改为.NET Framework 4.8,与类库框架保持一致,运行时会加载.NET Framework版本的基础类库,无需修改业务代码即可正常运行。
注意事项
修改代码后需确认NetworkConnection传递的管理员账号对目标网络共享目录拥有修改安全描述符的权限,否则会触发权限不足的报错。
内容的提问来源于stack exchange,提问作者julian bechtold
相关产品推荐
相关产品推荐

