ILASM汇编含double类型NaN、Inf值的IL文件时语法报错求助
反编译IL后汇编特殊浮点值报错的解决方法
问题场景
- 编写的测试程序核心代码为:
var a = double.NaN; - 使用Visual Studio 2019基于.NET Framework 4.5编译项目后,通过版本4.0.30319.0的ILDASM.exe将程序反编译为.il格式文件,对应生成的IL指令为:
IL_0001: ldc.r8 -nan(ind) - 后续使用版本4.8.3752.0的ILASM.exe对该IL文件汇编时,触发语法报错:
test.il(65) : error : syntax error at token '-' in: IL_0001: ldc.r8 -nan(ind) - 同类报错也会在初始化
Double.PositiveInfinity、Double.NegativeInfinity变量时出现。
报错根因
跨版本混用ILDASM和ILASM工具链时,老版本ILDASM输出的-nan(ind)、inf、-inf这类C/C++风格的特殊浮点值标识,并不在ILASM支持的合法语法范围内,本质是不同版本工具对特殊浮点常量的输出语法差异,并非IL代码逻辑错误。
具体解决方案
- 替换特殊浮点值的字面量为ILASM兼容写法:直接将反编译生成的非法标识替换为ILASM可识别的带位标记的常量格式:
- 对应
double.NaN:将ldc.r8 -nan(ind)替换为ldc.r8 #QNaN(0x7FF8000000000000) - 对应
double.PositiveInfinity:将反编译生成的ldc.r8 inf替换为ldc.r8 #INF(0x7FF0000000000000) - 对应
double.NegativeInfinity:将反编译生成的ldc.r8 -inf替换为ldc.r8 #INF(0xFFF0000000000000)
- 对应
- 统一工具链版本:将反编译用的ILDASM和汇编用的ILASM调整为同一SDK版本下的配套工具(如均使用.NET Framework 4.8 SDK目录下的工具),避免跨大版本混用带来的语法输出差异,从根源减少此类兼容问题。
- 绕开常量加载写法:不直接用
ldc.r8加载特殊浮点值,改为通过加载静态字段的方式实现初始化,这类写法对ILASM的全版本兼容性最好:- 初始化
double.NaN替换为ldsfld [mscorlib]System.Double::NaN - 初始化
double.PositiveInfinity替换为ldsfld [mscorlib]System.Double::PositiveInfinity - 初始化
double.NegativeInfinity替换为ldsfld [mscorlib]System.Double::NegativeInfinity
- 初始化
内容的提问来源于stack exchange,提问作者Hongbii Khaw
相关产品推荐
相关产品推荐

