尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

给旧版 .NET 开道 “私有通路”:ILAccess.Fody 达成逻辑与设计精髓

给旧版 .NET 开道 “私有通路”:ILAccess.Fody 达成逻辑与设计精髓
📅 发布时间:2026/6/21 0:12:43

给旧版 .NET 开道 “私有通路”:ILAccess.Fody 达成逻辑与设计精髓

前言 

目录

前言 

从 UnsafeAccessor 说起

ILAccess.Fody 诞生

使用方法 (和UnsafeAccessor几乎一样)

核心实现: 编译期注入 IL

额外处理

访问私有成员方法的对比

结语


.NET 8 带来底层开发者的福音:新特性 UnsafeAccessor 无需反射即可强类型、零开销访问类的私有字段、方法与构造函数。

举个例子:

// 目标类:包含私有字段的Dog
public class Dog
{// 私有字段(默认初始值)private string _name = "Puppy";
}
// 专用访问器类:通过UnsafeAccessor突破私有成员访问限制
public static class DogUnsafeAccessors
{/// /// 无反射访问Dog的私有字段_name(强类型+零开销)/// [UnsafeAccessor(UnsafeAccessorKind.Field, Name = "_name")]public static extern ref string GetPrivateName(Dog dogInstance);
}
// 调用示例
var dog = new Dog();
// 通过访问器获取私有字段的引用(支持读写操作)
ref var privateName = ref DogUnsafeAccessors.GetPrivateName(dog);
Console.WriteLine(privateName); // 输出:Puppy

CLR 会在运行时将 GetName 绑定到 _name 字段, 生成直接访问的 IL 指令.性能几乎和直接访问公有字段相当.

Benchmark(来自 Sharmila Malar 的 Medium 文章)

  • Reflection: ~10.9 ns
  • UnsafeAccessor: ~1.99 ns
  • Direct Access: ~1.81 ns

但是, 这个特性只在 .NET 8+ 可用.

ILAccess.Fody 诞生

  1. 为让 .NET Framework、.NET 6、.NET Standard 等旧版平台,也能拥有 “反射级灵活 + 原生级性能” 的私有成员访问能力,我开发了 ILAccess.Fody。它复刻了 .NET 8 UnsafeAccessor 的语法与体验,底层通过 Fody + Mono.Cecil 在编译期修改 IL 实现。

Mono.Cecil 是 .NET 程序集操作库,支持不加载程序集即可读写、生成 IL;Fody 则基于它简化了编译期织入,无需复杂配置 MSBuild/VS 管线,就能直接修改程序集 IL。

  1. 想让 .NET Framework、.NET 6 及 .NET Standard 等旧版 .NET 也用上 “反射般灵活、原生级高效” 的私有访问能力,于是有了 ILAccess.Fody。它和 .NET 8 UnsafeAccessor 语法、体验几乎一致,核心靠 Fody + Mono.Cecil 编译期改 IL 实现。

Mono.Cecil 可无加载解析 .NET 程序集、操作 IL;Fody 则简化了编译期干预,不用手动处理复杂构建管线,就能轻松完成 IL 修改。

使用方法 (和UnsafeAccessor几乎一样)

static class DogILAccessors
{// UnsafeAccessorAttribute -> ILAccessorAttribute// UnsafeAccessorKind -> ILAccessorKind[ILAccessor(ILAccessorKind.Field, Name = "_name")]public static extern ref string GetName(Dog d);
}
var dog = new Dog();
ref var name = ref DogILAccessors.GetName(dog);
Console.WriteLine(name); // Puppy

编译后, ILAccess.Fody 会将这些标记了 ILAccessor 的桩方法体替换为直接访问私有成员的 IL :

.method public hidebysig static string& GetName(class ILAccess.Dog d) cil managed
{IL_0000: ldarg.0      // dIL_0001: ldflda       string ILAccess.Dog::_nameIL_0006: ret
}

没有反射、没有委托、没有运行时查找.


核心实现: 编译期注入 IL

  • 遍历所有方法, 找到带 [ILAccessor] 的桩方法.
  • 根据不同的 ILAccessorKind 生成对应的 IL 指令.
  • 确定目标类型, 对于构造函数目标类型就是桩方法的返回类型, 其余的就是桩方法的第一个参数的类型.
  • 对于字段, 根据字段名匹配, 在目标类型的声明字段里找到目标字段, 然后根据是否为静态选择 Ldsfld 或 Ldfld 指令, 如果是 ref访问, 则需选择 Ldsflda 或 Ldfld
  • 对于方法, 则需要根据方法名+泛型参数个数+参数类型列表来匹配, 在目标类型的声明方法里找到目标方法, 然后选择 callvirt 或 call 指令
  • 对于构造函数, 其实就是一个名为 .ctor 的方法, 处理方式和普通方法类似, 不过指令是 newobj

额外处理

  • 当想访问的私有成员的类型是定义在一个 引用程序集(Reference Assemblies) 中

比如想访问基础库中的 List<T> 的 _items, 而基础库在编译时通常会以 引用程序集 的形式进行引用, 此时这个程序集只包含这个类型的公共成员的定义, 不包括其实现以及所有的私有成员. 那么就无法根据名称找到私有成员的用于生成 IL 的元数据.
解决方法: 先通过引用程序集的路径找到其对应的 实现程序集(Implementation Assemblies) 的路径, 并从其中读取所需的元数据.

  • 当想访问的私有成员的类型并不定义在当前被编译的程序集中

这种情况如果直接使用 IL 指令访问其私有成员会触发 MethodAccessException 或者 FieldAccessException 之类的异常.
解决方法: 使用 IgnoresAccessChecksToAttribute 跳过对想访问的程序集的权限检查. 例如

[assembly: IgnoresAccessChecksTo("System.Private.CoreLib")] // 跳过对基础库的访问检查

不过在使用 ILAccess.Fody 的时候无需手动添加这些代码, 它会自动生成并注入到被编译的程序集中.


访问私有成员方法的对比

特性反射UnsafeAccessorILAccess.Fody
支持平台所有 .NET 平台仅 .NET 8+全部 .NET 平台
实现方式运行时查找CLR 运行时注入Fody 编译期注入
性能慢几乎接近直接访问几乎接近直接访问
编译期验证❌❌✅
AOT支持⚠️ 受限支持✅✅

结语

ILAccess.Fody 的目标很纯粹:

让旧版 .NET 也能拥有 UnsafeAccessor 的力量.

它用编译期 IL 注入的方式, 让私有访问变得强大而安全.

相关新闻

  • 添加SSL证书后 润乾报表参数模板报错:此表单不安全。因此,系统已关闭自动填充
  • 2025 年足浴系统软件公司最新推荐榜,聚焦厂商技术实力与市场口碑深度解析足浴收银系统/足疗收银系统/足浴店管理系统/,足浴店收银系统/足疗店收银系统/足浴门店管理系统软件公司推荐
  • 2025年12月北京小程序开发公司排名,基于客户复购率的3家优质服务商盘点,活动小程序/工单小程序/寺庙小程序/律所小程序定制小程序开发公司推荐

最新新闻

  • 3分钟上手:用这个Chrome扩展彻底改变你的Markdown阅读体验
  • 5大核心技术解析:gdsdecomp如何实现Godot游戏逆向工程的零门槛突破
  • 东莞电源线加工厂有哪些?全链路源头加工认准东莞市正好电气有限公司 - 速递信息
  • 重塑规矩意识!福建靠谱军事化特训机构-科学矫正不良行为习惯 - 武汉中职最新信息发布
  • 寄大件怎么最省钱?2026物流公司价格对比 - 快递物流资讯
  • 政企协同筑通信屏障 本土担当护冰雪亚冬:海能达专网方案落地龙江,黑龙江单工科技以专业服务诠释保障使命 - 无线电评测大师

日新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号