zoukankan      html  css  js  c++  java
  • 维护没有源代码,float改成double

    	float f= 931340.31f;
    	Console.WriteLine(f.ToString("#,###,##0.00"));
    

    返回 931,340.30 ,float 10w以上2位小数,就会掉精度,改成double,没有源代码  

    ilasm和ildasm要相同Framework才行 framework2反编译的,不能用1.1编译通过

    1.1的代码 ,没装vs2003 ,ildasm 在 sc_vs.net_2003_enar_cd2.iso

    Program FilesMicrosoft Visual Studio .NET 2003SDKv1.1Bin 下,单独解压可以用

    Model.Common,Data.Common,WebHr,Web.PageControl ,找到所有BasicSalary 关键字 float32改成float64 (这个double )

    附近Null2Float改成Null2Double,NullFloat改成NullDouble 

    Model.Common 缺NullDouble 方法

    在NullFloat附近添加

        .method public hidebysig static float64 
                NullDouble(object 'value') cil managed
        {
          // 代码大小       16 (0x10)
          .maxstack  2
          IL_0000:  ldarg.0
          IL_0001:  ldc.r8     0.0
          IL_000a:  call       float64 Penseesoft.Web.Model.Utility.NullUtil::NullDouble(object,
                                                                                         float64)
          IL_000f:  ret
        } // end of method NullUtil::NullDouble
    
        .method public hidebysig static float64 
                NullDouble(object 'value',
                           float64 defaultValue) cil managed
        {
          // 代码大小       38 (0x26)
          .maxstack  1
          .locals init (float64 V_0)
          IL_0000:  ldarg.0
          IL_0001:  call       bool Penseesoft.Web.Model.Utility.NullUtil::IsNullObject(object)
          IL_0006:  brfalse.s  IL_000c
    
          IL_0008:  ldarg.1
          IL_0009:  stloc.0
          IL_000a:  br.s       IL_0024
    
          .try
          {
            IL_000c:  ldarg.0
            IL_000d:  call       float64 [mscorlib]System.Convert::ToDouble(object)
            IL_0012:  stloc.0
            IL_0013:  ldloc.0
            IL_0014:  call       bool [mscorlib]System.Double::IsNaN(float64)
            IL_0019:  brfalse.s  IL_001d
    
            IL_001b:  ldarg.1
            IL_001c:  stloc.0
            IL_001d:  leave.s    IL_0024
    
          }  // end .try
          catch [mscorlib]System.Exception 
          {
            IL_001f:  pop
            IL_0020:  ldarg.1
            IL_0021:  stloc.0
            IL_0022:  leave.s    IL_0024
    
          }  // end handler
          IL_0024:  ldloc.0
          IL_0025:  ret
        } // end of method NullUtil::NullDouble
    

      

    callvirt instance float32 [Model.Common]Penseesoft.Web.Model.StaffInfo::get_BasicSalary()
    stloc.s V_9
     ldloca.s V_9
     ldstr "#,##0.00"
    call instance string [mscorlib]System.Single::ToString(string)

    另外.net调用过程,压堆栈,会压一个变量 V_9 

    变量申明在 函数申明后

    .locals init (int32 V_0,
    class [System.Web]System.Web.UI.WebControls.Panel V_1,
    class [Model.Common]Penseesoft.Web.Model.StaffInfo V_2,
    class [Model.Payroll]Penseesoft.Web.Model.Payroll.PayTermsInfo V_3,
    int32 V_4,
    class [System.Data]System.Data.DataRow V_5,
    class [System.Web]System.Web.UI.WebControls.Panel[] V_6,
    int32 V_7,
    valuetype [mscorlib]System.DateTime V_8,
    float32 V_9,
    float64 V_10)

    如果本来V_9 是float32,方法改成double,如果不新增float64 V_10 ,改成V_10的话,float, ilasm可以编译过,运行会出一个很大数字。

    ilspy + Reflexil ,有Verfiy菜单项可以用下,看编译的dll是否有问题 

    bat文件

    set ilasm=%windir%Microsoft.NETFrameworkv1.1.4322ilasm /dll /QUIET

    %ilasm% Web.PageControls.il /res:Web.PageControls.res
    %ilasm% WebHr.il /res:WebHr.res
    %ilasm% Data.Common.il /res:Data.Common.res
    %ilasm% Model.Common.il /res:Model.Common.res

    pause

  • 相关阅读:
    #特征方程,dp,快速幂#洛谷 4451 [国家集训队]整数的lqp拆分
    #状压dp,贪心#CF1316E Team Building
    #线段树,欧拉函数#CF1114F Please, another Queries on Array?
    #启发式合并,链表#洛谷 3201 [HNOI2009] 梦幻布丁
    #树状数组#洛谷 4113 [HEOI2012]采花
    #链表#洛谷 3794 签到题IV
    #矩阵乘法,斐波那契#洛谷 2544 [AHOI2004] 数字迷阵
    #dp#洛谷 4399 [JSOI2008]Blue Mary的职员分配
    #同余最短路#洛谷 3403 跳楼机
    #网络流,分层图#洛谷 4400 [JSOI2008] Blue Mary的旅行
  • 原文地址:https://www.cnblogs.com/peteryu007/p/5647256.html
Copyright © 2011-2022 走看看