You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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>&lt;Clone&gt;$</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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 11:28:11