Isinst操作码在不应该返回null值时返回null值

时间:2011-02-21 22:32:25

标签: .net cil opcode

最近我通过在CultureDefinition类中的一个函数中添加IL代码来覆盖GAC中的sysglobl.dll,因此.net框架和visual studio直接从GAC加载更改的dll。 功能是:
System.Globalization.CalendarId CalendarIdofCalendar(System.Globalization.Calendar)
这是ildasm工具的代码。

IL_0077:  ldarg.0  
IL_0078:  isinst     [mscorlib]System.Globalization.KoreanCalendar  
IL_007d:  brfalse.s  IL_0081  
IL_007f:  ldc.i4.5  
IL_0080:  ret  
IL_0081:  ldarg.0  
IL_0082:  isinst     [mscorlib]System.Globalization.HijriCalendar  
IL_0087:  brfalse.s  IL_008b  
IL_0089:  ldc.i4.6  
IL_008a:  ret  
  

添加的代码

    IL_008b:  ldarg.0  
IL_008c:  isinst     [mscorlib]System.Globalization.PersianCalendar  
IL_0091:  brfalse.s  IL_0096  
IL_0093:  ldc.i4.s   22  
IL_0095:  ret  
  

已添加代码的结尾

IL_0096:  ldarg.0  
IL_0097:  isinst     [mscorlib]System.Globalization.UmAlQuraCalendar  
IL_009c:  brfalse.s  IL_00a1  
IL_009e:  ldc.i4.s   23  
IL_00a0:  ret  
IL_00a1:  ldstr      "CustomCaledarsNotSupported"  
IL_00a6:  call       string   System.Globalization.CultureAndRegionInfoBuilder::GetResourceString(string)  
IL_00ab:  newobj     instance void  [mscorlib]System.NotSupportedException::.ctor(string)    
IL_00b0:  throw  

现在这是行

的问题
__IL_008c: isinst [mscorlib]System.Globalization.PersianCalendar__     

当我传递PersianCalendar isinst returnS null值的实例时,该函数将抛出NotSupportedException。但如果我通过HijriCalendar它工作正常,将去 线

**IL_0089: ldc.i4.6**  

等等。

我找不到我添加的部分无法工作的原因。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

你究竟是如何做出改变的?代码本身看起来很好,我的猜测是元数据表或其他元数据信息变得混乱,因此[mscorlib]System.Globalization.PersianCalendar令牌实际上并没有引用它应该是什么,或者实际的程序集没有得到适当的调用。