.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的构建目标是否正确注入项目:
打开.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自动添加这些构建配置。
移除手动实现的INotifyPropertyChanged接口
标记[AddINotifyPropertyChangedInterface]后,无需手动实现接口和PropertyChanged事件,这会干扰Fody的织入逻辑,修改后的类应为:[AddINotifyPropertyChangedInterface] public class NotifyingClass { public string Prop1{ get; set; } }清理并重新构建
- 执行
Clean Solution,手动删除bin、obj目录 - 重新构建项目,查看构建输出日志,确认是否有Fody相关执行记录
- 执行
检查FodyWeavers.xml的复制属性
确保该文件的Copy to Output Directory设置为Copy if newer或Copy always,否则Fody构建时无法读取配置。
内容的提问来源于stack exchange,提问作者AMG
相关产品推荐
相关产品推荐

