Редактировать: судя по коду, возможно, IL_0005 предназначен для вызова / callvirt, а не для ldftn? Возможно, эмитент использует неправильный код операции?
Local 1 - это IScope. ldftn помещает указатель функции (native int) в стек оценки. Инструкция сохранения в IL_000b не поддается проверке, так как нативный int не может быть назначен для верификатора IScope.
Что касается вашей второй проблемы, вы разбалансировали стек оценки с помощью инструкции на IL_0004. Переход стека ldftn - "... -> ..., ftn". Это означает, что он не принимает аргумент стека оценки, только токен метаданных. Изменяя IL_000b на pop, вы выводите то, что ldftn нажал, но не то, что IL_0004 нажал.
Что мне не понятно, это то, что вы пытаетесь сделать. Вы не можете рассматривать единственный указатель на функцию как интерфейс (о котором вы могли бы думать, по крайней мере, концептуально, как указатель на v-таблицу). Вам необходимо создать экземпляр типа, который реализует интерфейс. То, что вы могли бы сделать с указателем на функцию, это создать делегата из него - Delegate имеет перегрузку (object, native int) для .ctor. Это было бы, где я предполагаю, что ссылка на объект, выдвинутая IL_0004, вступит в игру (первый аргумент этого .ctor). Конечно, вы также можете напрямую вызывать указатель на функцию. Поскольку я не знаком с этой объектной моделью, с которой вы взаимодействуете, я не могу сказать, каков правильный подход.