【问题标题】:Isinst opcode returns null value when it shouldn'tIsinst 操作码在不应该返回空值时返回
【发布时间】:2011-02-21 22:32:25
【问题描述】:

最近我通过将 IL 代码添加到 CultureDefinition 类中的一个函数来覆盖 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 返回空值,因此该函数将抛出 NotSupportedException。但如果我通过 HijriCalendar 它工作正常,会去 线

**IL_0089: ldc.i4.6**  

等等。

我找不到我添加的部分不起作用的原因。

提前谢谢你。

【问题讨论】:

  • 你到底在哪个类中添加/修改了什么?
  • 最重要的是,为什么?为什么不在自己的类库中编写普通的 C# 代码?你为什么要对 .NET 运行时程序集进行猴子补丁?
  • 代码应该是粗体,正如我在帖子中提到的,类是来自 sysglobl.dll 的 CultureDefinition,函数是 CalendarIdofCalendar,原因:cultureinfo 不接受自定义日历和微软错误地为 fa-IR 文化实施了可选日历,并且没有 persiancalendar。微软知道它的年代,他们只是不修复它:(
  • 如果你想分发你的应用程序,这真的是不支持的。如果您已经知道要返回的 ID,只需包装对 CalendarIdofCalendar 的调用并检查类型,然后返回 22。
  • @TPECI - 我很怀疑,但是,我仍然会考虑通过使用 CultureInfo 的一些显式调用来抽象对它的任何调用。从长远来看,你会好很多,很多

标签: .net cil opcode


【解决方案1】:

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

【讨论】:

  • 我找到了原因,我需要从 64 位框架中删除 sysglobl.ni.dll,我已经删除了 32 位,但没有删除 64 位。
猜你喜欢
  • 2019-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
  • 2013-03-06
相关资源
最近更新 更多