У меня проблемы при добавлении метода и заполнении его инструкциями. Я нашел необходимый тип, добавленный метод без проблем, но когда я добавляю вызов WriteLine, он не работает.Mono Cecil, метод и ввод инструкции
foreach (TypeDefinition type in assembly.MainModule.Types)
{
if (type.Name == "ClassB")
{
//TypeReference returntype = assembly.MainModule.Import(typeof(void));
MethodDefinition met = new MethodDefinition("Test",
MethodAttributes.Private | MethodAttributes.Static,
assembly.MainModule.TypeSystem.Void);
type.Methods.Add(met);
ILProcessor worker = met.Body.GetILProcessor();
Instruction msg = worker.Create(OpCodes.Ldstr, "Hello!");
MethodReference writeline = assembly.MainModule.Import(typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
met.Body.Instructions.Insert(0, msg);
met.Body.Instructions.Insert(1, Instruction.Create(OpCodes.Call, writeline));
}
Когда я декомпилирую код, я получаю // // ВЫБОР: не удается декомпилировать метод. в теле метода (я использую dotPeek). Добавление вызова к уже существующему методу в сборке работает отлично - оно видно и выполняется правильно. Во время работы он не создает никаких ошибок.
Может быть, взглянуть на это [GitHub повторении] (https: // GitHub .com/markusschweitzer/ILRewriter) :) – Markus