【发布时间】: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 的一些显式调用来抽象对它的任何调用。从长远来看,你会好很多,很多。