Hyz.Trace.Weaving.Fody
1.2.3
dotnet add package Hyz.Trace.Weaving.Fody --version 1.2.3
NuGet\Install-Package Hyz.Trace.Weaving.Fody -Version 1.2.3
<PackageReference Include="Hyz.Trace.Weaving.Fody" Version="1.2.3"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
<PackageVersion Include="Hyz.Trace.Weaving.Fody" Version="1.2.3" />
<PackageReference Include="Hyz.Trace.Weaving.Fody"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
paket add Hyz.Trace.Weaving.Fody --version 1.2.3
#r "nuget: Hyz.Trace.Weaving.Fody, 1.2.3"
#:package Hyz.Trace.Weaving.Fody@1.2.3
#addin nuget:?package=Hyz.Trace.Weaving.Fody&version=1.2.3
#tool nuget:?package=Hyz.Trace.Weaving.Fody&version=1.2.3
Hyz.Trace.Weaving.Fody
Hyz.Trace 的 Fody IL 编织器 — 编译时扫描 [Trace] 特性,采用方法外壳包装(Thunk/Wrapper)模式自动织入 TraceScope 包装代码,实现方法级 Span 的零侵入捕获,理论编织成功率 100%。
安装
dotnet add package Hyz.Trace.Weaving.Fody
本包不包含 Hyz.Trace 核心库,需配合以下任一包使用:
Hyz.Trace.Client(客户端元包,推荐)Hyz.Trace(仅核心库)
工作原理
方法外壳包装(Thunk/Wrapper)模式:与传统的内联 IL 修改方式不同,本编织器完全不修改原方法体,而是:
- 编译时 Fody 加载本 weaver DLL
- 扫描程序集中所有标注
[Trace]特性的方法或类 - 重命名原方法:将原方法重命名为
<MethodName>__TraceOriginal,改为private,原方法体 IL 保持 100% 不变 - 生成包装方法:创建一个与原方法签名完全一致的新方法(public/原访问级别)
- 织入追踪代码:包装方法内部通过
TraceScope.Run()/TraceScope.RunAsync()调用原方法,自动处理:- Span 创建与命名(默认
{TypeName}.{MethodName}) - 输入参数捕获
- 返回值捕获
- 异常自动捕获与
SetError() - 正常完成时
SetOk() using模式确保Dispose()始终执行
- Span 创建与命名(默认
- 对于
ref/out参数,采用直接 IL 路径避免闭包开销 - 内部调用自动重定向到包装方法,确保追踪连续性
核心优势:原方法体完全不被修改,从根本上避免了内联编织遇到复杂控制流(多 return、try-catch-finally、using、lock、迭代器、泛型方法、Dictionary 初始化器等)时的 IL 验证失败和 InvalidProgramException。
支持的方法类型
| 方法类型 | 支持状态 | 说明 |
|---|---|---|
| 同步无返回值(void) | ✅ | SyncVoid 模式 |
| 同步有返回值(TResult) | ✅ | SyncFunc 模式 |
| 异步 Task(无返回值) | ✅ | AsyncTask 模式,async/await 原生支持 |
| 异步 Task<T>(有返回值) | ✅ | AsyncTaskT 模式 |
| 实例方法 | ✅ | |
| 静态方法(方法级 [Trace]) | ✅ | 需在方法上显式标记 [Trace] |
| 静态方法(类级 [Trace]) | ❌ | 类级 [Trace] 默认不包含静态方法,需逐个标记 |
| 泛型方法 | ✅ | 自动处理泛型参数映射 |
| ref/out 参数 | ✅ | 直接 IL 路径,无闭包开销 |
| 构造函数 | ❌ | 不支持编织 |
| abstract 方法 | ❌ | 无方法体 |
| 编译器生成方法 | ❌ | 自动跳过(get_/set_/move_next 等) |
| 私有方法(类级 [Trace]) | ❌ | 类级 [Trace] 仅编织 public 实例方法 |
| 复杂控制流(try-catch/using/lock/多return/迭代器/递归) | ✅ | 原方法体不修改,全部支持 |
使用示例
using Hyz.Trace;
// 方法级追踪:自动生成 Span,名称为 "UserService.GetUser"
public class UserService
{
[Trace]
public User? GetUser(int id)
{
// 业务代码...
return userRepository.Find(id);
}
}
// 类级追踪:所有 public 实例方法自动生成 Span
[Trace]
public class OrderService
{
// 会被自动编织
public Order CreateOrder(CreateOrderRequest request) { /* ... */ }
// 会被自动编织
public void CancelOrder(int orderId) { /* ... */ }
// 不会被编织:private 方法
private void InternalHelper() { /* ... */ }
// 不会被自动编织:static 方法(类级 [Trace] 不包含静态)
// 如需追踪,需显式加 [Trace]
[Trace]
public static Order? FindById(int id) { /* ... */ }
}
// 自定义 Span 名称
public class PaymentService
{
[Trace(Name = "process-payment")]
public PaymentResult Process(PaymentRequest request) { /* ... */ }
}
// 复杂方法也能正常编织:含 try-catch-finally、多 return、using、泛型、lambda 闭包等
[Trace]
public static HttpResult<T> WebRequest<T>(string url, Dictionary<string, string>? headers = null)
{
// 任意复杂控制流都不会导致编织失败
// 原方法体完全保持不变
}
编译日志
编织过程会在 Visual Studio 生成输出中打印详细日志(前缀 [Hyz.Trace.Weaving]):
Normal 详细级别:
OK {Kind} {MethodName}:编织成功(显示方法类型:SyncVoid/SyncFunc/AsyncTask/AsyncTaskT)SKIP {Source} {MethodName} : {原因}:跳过编织- 汇总统计:总计扫描/成功/跳过/失败数量
Detailed 详细级别:
FAIL {MethodName} : {错误信息}:编织失败(带完整异常堆栈)- 失败状态始终在 Normal 级别显示为警告
日志示例
[Hyz.Trace.Weaving] =========================================================
[Hyz.Trace.Weaving] 开始扫描程序集: Hyz.Trace.Demo.NetFramework.Console
[Hyz.Trace.Weaving] =========================================================
[Hyz.Trace.Weaving] --- Hyz.Trace.Demo.NetFramework.TraceConsole.Services.OrderService ---
[Hyz.Trace.Weaving] OK SyncFunc CreateOrder
[Hyz.Trace.Weaving] OK SyncFunc GetOrder
[Hyz.Trace.Weaving] --- Hyz.Trace.Demo.NetFramework.TraceConsole.Services.SafetyStressService ---
[Hyz.Trace.Weaving] OK SyncFunc PrivateGeneric
[Hyz.Trace.Weaving] OK SyncFunc PublicWithUsingAndThrow
[Hyz.Trace.Weaving] OK SyncFunc MultiBranchServiceCallHandle
[Hyz.Trace.Weaving] ...
[Hyz.Trace.Weaving] =========================================================
[Hyz.Trace.Weaving] 编织完成: 总计 86, 成功 49, 跳过 37, 失败 0
[Hyz.Trace.Weaving] =========================================================
安全保障机制
- 原方法体零修改:从根本上避免 IL 损坏
- 原子提交:新类型/方法先添加到模块树,再生成 IL,失败时自动回滚
- 运行时保护:
TraceScope公共方法均有 try-catch,追踪异常绝不影响业务代码 - IL 栈验证:编织完成后验证方法体 IL 栈深度正确性
与元包的关系
Hyz.Trace.Client 元包默认不包含本包,以避免与独立引用时的双重编织冲突。如需 IL 编织能力,请显式安装本包。
依赖
- Fody 6.9.3(自动作为传递依赖引入)
Hyz.Trace核心库(需使用者自行引用)
目标框架
netstandard2.0 — 兼容所有支持 .NET Standard 2.0 的运行时(.NET Framework 4.6.2+、.NET Core 2.0+、.NET 5+)。
Learn more about Target Frameworks and .NET Standard.
-
.NETStandard 2.0
- Fody (>= 6.9.3)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.2.3 | 0 | 8/2/2026 |
| 1.2.2 | 0 | 8/1/2026 |
| 1.2.1 | 0 | 8/1/2026 |
| 1.2.0 | 25 | 8/1/2026 |
| 1.1.0 | 28 | 8/1/2026 |
| 1.0.0 | 50 | 7/31/2026 |
| 0.9.0 | 37 | 7/31/2026 |
| 0.8.0 | 38 | 7/31/2026 |
| 0.7.0 | 42 | 7/31/2026 |
| 0.6.0 | 40 | 7/31/2026 |
| 0.5.0 | 58 | 7/30/2026 |
| 0.4.0 | 83 | 7/29/2026 |
| 0.3.0 | 75 | 7/28/2026 |
| 0.2.0 | 87 | 7/27/2026 |
| 0.1.0 | 95 | 7/14/2026 |