如何通过命令行工具检测.NET程序集是否使用unsafe代码
命令行检测.NET程序集(DLL/EXE)是否使用unsafe代码的方法
核心判断逻辑:C#编译器只要在开启AllowUnsafeBlocks(即/unsafe编译开关)的情况下生成程序集,就会自动在程序集元数据中注入System.Security.UnverifiableCodeAttribute特性,这是判断程序集是否包含unsafe代码的最可靠标志,无需逐行解析IL逻辑。
方法1:使用.NET Framework/.NET SDK自带的ildasm工具(全版本通用,准确率最高)
- 打开终端(VS开发者命令提示符、普通cmd/powershell、bash/zsh均可,只要ildasm已加入环境变量)
- 执行以下命令提取程序集元数据做匹配:
Windows环境:ildasm /text /nobar /headers 目标程序集路径.dll | findstr UnverifiableCode
Linux/macOS环境:ildasm /text /nobar /headers 目标程序集路径.dll | grep UnverifiableCode - 结果判定:
- 如果输出包含
custom attribute instance void [System.Runtime]System.Security.UnverifiableCodeAttribute::.ctor(),说明程序集编译时开启了unsafe开关,包含unsafe代码 - 无匹配输出则说明程序集未使用unsafe代码
- 如果输出包含
提示:ildasm是官方提供的IL反汇编工具,随Visual Studio、.NET SDK默认安装,不需要额外下载第三方工具,检测结果不存在误判漏判。
方法2:使用跨平台ILVerify工具(适配.NET Core/.NET 5+场景)
- 若本地未安装ILVerify,先执行dotnet工具安装命令:
dotnet tool install -g dotnet-ilverify - 执行检测命令:
Windows环境:ilverify 目标程序集路径.dll --skip-method-body-validation | findstr "Unverifiable unsafe"
Linux/macOS环境:ilverify 目标程序集路径.dll --skip-method-body-validation | grep "Unverifiable unsafe" - 结果判定:输出包含
Unverifiable PE Header或相关不可验证代码提示时,说明程序集使用了unsafe代码。
方法3:PowerShell一行命令检测(Windows环境无额外依赖)
直接在PowerShell终端执行以下命令即可:
[System.Reflection.Assembly]::ReflectionOnlyLoadFrom((Resolve-Path 目标程序集路径.dll)).GetCustomAttributesData() | Where-Object {$_.AttributeType.FullName -eq 'System.Security.UnverifiableCodeAttribute'}
- 结果判定:命令执行后有返回内容则代表程序集使用了unsafe代码,无返回内容则未使用。
注意:UnverifiableCodeAttribute是编译器自动注入的特性,正常开发流程中不会手动给程序集添加该特性,因此以上检测方式的结果均可靠。
内容的提问来源于stack exchange,提问作者Evgeniy Berezovsky
相关产品推荐
相关产品推荐

