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

.NET 4.7.2项目中Fody PropertyChanged织入失效问题求助

Fody PropertyChanged未完成代码织入,PropertyChanged事件不触发

项目环境

  • .NET Framework 4.7.2 项目
  • 通过NuGet安装了Fody 6.6.4和PropertyChanged.Fody 4.1.0,但解决方案资源管理器中仅显示"PropertyChanged"引用

问题现象

  • 标记[AddINotifyPropertyChangedInterface]的类,PropertyChanged事件始终不触发
  • 用JustDecompile和dotPeek反编译程序集,未看到Fody织入的代码逻辑
  • 使用[OnChangedMethod]属性也无效果,推测Fody未完成织入操作

代码示例

通知类代码

[AddINotifyPropertyChangedInterface]
public class NotifyingClass: INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public string Prop1{ get; set; }
}

测试代码

public class MyClass
{
    public NotifyingClass notifying {get; set; }
    private bool hasChanges = false;

    public MyForm()
    {
        InitializeComponent();
        var test = new NotifyingClass();
        test.PropertyChanged += (sender, args)=>{
            hasChanges = true; // 永远不会被调用
        };

        test.Prop1 = "new value";

        if(!hasChanges) throw new Exception("PropertyChanged did not fire");
    }
}

配置文件内容

FodyWeavers.xml

<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
  <PropertyChanged />
</Weavers>

.csproj中相关引用

<Import Project="packages\PropertyChanged.Fody.4.1.0\build\PropertyChanged.Fody.props" Condition="Exists('packages\PropertyChanged.Fody.4.1.0\build\PropertyChanged.Fody.props')" />

<Content Include="FodyWeavers.xml" />

<Reference Include="PropertyChanged, Version=4.1.0.0, Culture=neutral, PublicKeyToken=ee3ee20bcf148ddd, processorArchitecture=MSIL">
  <HintPath>packages\PropertyChanged.Fody.4.1.0\lib\net40\PropertyChanged.dll</HintPath>
</Reference>

问题解答及修复步骤

是否需要单独引用Fody包?

PropertyChanged.Fody作为Fody的插件,安装时会自动依赖安装Fody,但仅安装包不足以确保织入生效,需确认Fody的构建目标是否正确注入项目:

  1. 打开.csproj文件,检查是否包含Fody的导入语句:

    <Import Project="packages\Fody.6.6.4\build\Fody.props" Condition="Exists('packages\Fody.6.6.4\build\Fody.props')" />
    <Import Project="packages\Fody.6.6.4\build\Fody.targets" Condition="Exists('packages\Fody.6.6.4\build\Fody.targets')" />
    

    若缺失,卸载并重新安装Fody和PropertyChanged.Fody包,确保NuGet自动添加这些构建配置。

  2. 移除手动实现的INotifyPropertyChanged接口
    标记[AddINotifyPropertyChangedInterface]后,无需手动实现接口和PropertyChanged事件,这会干扰Fody的织入逻辑,修改后的类应为:

    [AddINotifyPropertyChangedInterface]
    public class NotifyingClass
    {
        public string Prop1{ get; set; }
    }
    
  3. 清理并重新构建

    • 执行Clean Solution,手动删除bin、obj目录
    • 重新构建项目,查看构建输出日志,确认是否有Fody相关执行记录
  4. 检查FodyWeavers.xml的复制属性
    确保该文件的Copy to Output Directory设置为Copy if newer或Copy always,否则Fody构建时无法读取配置。

内容的提问来源于stack exchange,提问作者AMG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:22:08