Fody NullGuard配置后自动空检查未生效,求解决方法
Troubleshooting Fody NullGuard Not Enforcing Null Checks
我之前也踩过NullGuard的这个坑,明明配置步骤都按文档来,结果空检查就是不生效。结合你的情况,给你几个可以逐一排查的关键点:
1. 构建模式与IncludeDebugAssert的匹配问题
你在FodyWeavers.xml里设置了IncludeDebugAssert="false",这意味着Debug模式下NullGuard不会注入抛出ArgumentNullException的代码,只会在Release模式下生效。如果你是在Debug模式运行测试,自然不会看到异常。
解决办法有两个:
- 切换到Release模式重新构建运行
- 修改配置让Debug模式也生效(注入
Debug.Assert检查):
<?xml version="1.0" encoding="utf-8"?> <Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd"> <NullGuard Mode="Implicit" IncludeDebugAssert="true" /> </Weavers>
2. 确认FodyWeavers.xml的文件属性
很多人容易忽略这个:确保你的FodyWeavers.xml在Visual Studio中的复制到输出目录属性设置为「如果较新则复制」或「始终复制」。如果这个文件没被复制到输出目录,Fody编译时找不到配置,就会用默认规则,可能导致检查不生效。
3. 验证Fody是否完成织入
可以通过MSBuild日志确认NullGuard是否正常工作:
- 打开Visual Studio的「工具」→「选项」→「项目和解决方案」→「生成并运行」,把「MSBuild项目生成输出详细程度」设为「详细」
- 重新构建项目,在输出窗口搜索「NullGuard」
- 如果能看到类似
NullGuard: Processing assembly XXX的日志,说明织入流程正常;如果没有,大概率是包安装出了问题,试试彻底重装:
PM> Uninstall-Package NullGuard.Fody PM> Uninstall-Package Fody PM> Install-Package Fody PM> Install-Package NullGuard.Fody
4. ReSharper的干扰排查
ReSharper的构建加速或优化特性确实可能干扰Fody的织入流程,你可以试试:
- 暂时关闭ReSharper的「构建加速」功能(在ReSharper选项→构建→构建加速里)
- 手动清空项目的
bin和obj目录,然后用Visual Studio原生构建(不是ReSharper的右键构建)重新编译运行 - 如果还是不行,可以临时禁用ReSharper,再测试一次
5. 显式验证规则生效
如果Implicit模式没生效,你可以先通过显式特性来测试NullGuard是否正常:
using NullGuard; // 给参数加上[NotNull]特性 static void TheFunc([NotNull] string o) { Console.WriteLine("I'm alive!"); } static void Main(string[] args) { TheFunc(null); Console.ReadKey(); }
如果这样调用TheFunc(null)能抛出异常,说明NullGuard本身是工作的,只是Implicit模式的规则没正确应用,需要再检查FodyWeavers.xml的配置是否有拼写错误(比如Mode="Implicit"有没有写错)。
内容的提问来源于stack exchange,提问作者codefluent
相关产品推荐
相关产品推荐

