Реальный ответ на мой вопрос был опубликован в виде комментария, а не ответа, так что в случае, если у кого-либо еще есть этот вопрос ... вот опубликованный ответ:
Вам понадобится класс SignatureHelper. Исправления предназначены только для компиляторов, которые переводят собственный код в IL, например, C ++ / CLI. - Ганс Пассант 10 марта в 13: 02
Итак ... чтобы получить байтовый массив для локальных подписей, вы можете выполнить этот код:
var sig = SignatureHelper.GetLocalVarSigHelper(this.module);
sig.AddArgument(typeof(int)); //Local #0 is of type int
...
sig.AddArgument(typeof(string)); //Local #n is of type string
var sigArray = sig.GetSignature();
И чтобы установить тело метода в MethodBuilder, вы вызываете
MethodBuilder.SetMethodBody(il, maxStack, sigArray, handlers, fixups);
... где il - это byte[]
с действительными инструкциями IL (см. на этой странице ), maxStack - целое число с количеством мест, резервируемых в стеке для метода, обработчики - это System.Reflection.Emit.ExceptionHandler[]
, а fixups - это массив int[]
, который можно игнорировать (с одним исключением, см. Ниже.)
В комментарии Ханса Пассанта я не согласен с тем, что исправления предназначены не только для компиляторов, которые переводят нативный код в IL. Работая над этим, я обнаружил, что если вы попытаетесь вызвать метод MethodBuilder
, он выдаст неверную инструкцию. Глядя на ILGenerator в .NET рефлекторе, я обнаружил, что они генерируют исправления каждый раз, когда они вызывают вызов метода. Добавление исправления для каждого вызова метода действительно решило эту проблему. Могут быть и другие места, где вам нужно создать исправление, чтобы оно работало корректно, но я не особо разбирался в этом.