.NET 8项目启用Fody/MethodTimer后触发InvalidProgramException,PEVerify报void类型签名非法等错误的解决方法
.NET 8项目启用Fody/MethodTimer后触发InvalidProgramException,PEVerify报void类型签名非法等错误的解决方法
这种问题我之前在处理Fody和.NET record类型的组合时也碰到过,核心原因是Fody/MethodTimer在处理.NET 8 record自动生成的<Clone>$方法时,错误地修改了方法签名或IL体,导致CLR检测到无效程序集,触发InvalidProgramException,同时PEVerify会报出你看到的两个错误:
- 非法使用
void类型签名 - MethodImpl的声明与方法体签名不匹配
具体解决方案
下面是几个亲测有效的解决办法,按优先级推荐:
1. 升级Fody/MethodTimer到最新稳定版
这个问题大概率是旧版本的MethodTimer对.NET 8的record类型支持不完善导致的兼容性Bug。直接打开NuGet包管理器,把MethodTimer.Fody和Fody都更新到最新版本,很多时候这类底层兼容性问题在新版本里已经被修复了。
2. 排除自动生成的<Clone>$方法不让Fody处理
如果升级后问题依然存在,或者你暂时无法升级版本,可以通过配置让MethodTimer跳过record自动生成的<Clone>$方法:
- 打开项目中的
FodyWeavers.xml文件(如果没有就新建一个),添加排除规则:<Weavers> <MethodTimer> <ExcludeMethods> <Method><Clone>$</Method> </ExcludeMethods> </MethodTimer> </Weavers> - 或者如果整个record类都不需要计时逻辑,直接在record上标记排除特性:
[MethodTimer.Exclude] public record MyClass { public string Name { get; init; } // 其他成员... }
3. 手动实现Clone方法(如果需要对克隆逻辑计时)
如果你确实需要对MyClass的克隆逻辑添加计时,不要依赖record自动生成的<Clone>$方法,手动实现一个Clone方法:
public record MyClass { public string Name { get; init; } // 其他成员... public MyClass Clone() { return this with { }; } }
同时确保在Fody配置里排除自动生成的<Clone>$方法,这样Fody只会处理你手动写的Clone方法,不会破坏自动生成的底层逻辑。
验证修复
修改完成后重新编译项目,然后用PEVerify命令检查程序集是否合法:
peverify YourProject.dll /verbose
如果PEVerify没有报错,再运行项目,InvalidProgramException应该就会消失了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

