Isinst опкод возвращает нулевое значение, когда это не должно - PullRequest
0 голосов
/ 22 февраля 2011

недавно я перезаписал sysglobl.dll в GAC, добавив код IL к одной из функций в классе CultureDefinition, так что .NET Framework и Visual Studio загружают измененную dll напрямую из GAC.Функция:
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**  

и т. д.

Я не могу найти причину, по которой часть, которую я добавил, не будет работать.

Заранее спасибо.

1 Ответ

0 голосов
/ 22 февраля 2011

Как именно вы вносите изменения?Сам код выглядит хорошо, я предполагаю, что таблицы метаданных или другая информация метаданных запутываются, поэтому токен [mscorlib]System.Globalization.PersianCalendar фактически не указывает на то, что должен, или что фактическая сборка не вызывается должным образом.

...