Я также нашел код, который Фрэнк нашел очень полезным, но у него есть одна проблема: код операции переключения неправильно обрабатывается.
Начиная с MSDN , за кодом операции следует int32, содержащий количество элементов в таблице переходов, а затем позиции для перехода. Таким образом, коммутатор с 3 элементами на самом деле имеет 16 байтов данных, а не 4.
Я использую код из второго поста Зиада Эльмалки по теме, которая включает метод GetData, для определения таких вещей, как цель вызова метода.
Я исправил обработку кодов операций переключателя, изменив их обработку в GetData, чтобы она выглядела примерно так:
case OperandType.InlineSwitch:
{
int numberOfCases = BitConverter.ToInt32(rawData, 0);
int[] caseAddresses = new int[numberOfCases];
byte[] caseData = new byte[4];
for (int i = 0; i < numberOfCases; i++)
{
_methodReader.Read(caseData, 0, caseData.Length);
caseAddresses[i] = BitConverter.ToInt32(caseData, 0);
}
data = caseAddresses;
}
break;