Я пытаюсь создать следующий класс:Что случилось с моей простой MSIL?
public class MyType
{
public string MyMethod() { return "Hi"; }
}
Мой Испустите код выглядит следующим образом:
var assemblyBuilder = GetAssemblyBuilder("MyAssembly");
var moduleBuilder = assemblyBuilder.DefineDynamicModule("MyModule");
var typeBuilder = moduleBuilder.DefineType("MyType", TypeAttributes.Public);
var methodBuilder = typeBuilder.DefineMethod("MyMethod", MethodAttributes.Public, typeof(string), new Type[] { });
var ilBuilder = methodBuilder.GetILGenerator();
ilBuilder.Emit(OpCodes.Nop);
ilBuilder.Emit(OpCodes.Ldstr, "Hi");
ilBuilder.Emit(OpCodes.Stloc_0);
ilBuilder.Emit(OpCodes.Br_S);
ilBuilder.Emit(OpCodes.Ldloc_0);
ilBuilder.Emit(OpCodes.Ret);
var type = typeBuilder.CreateType();
но когда я призываю MyMethod
на примере MyType
я получаю InvalidProgramException
: общий язык Runtime обнаружила недопустимую программу.
Я попытался изменить тип возврата на void
и используя только EmitWriteLine
и Emit(OpCodes.Ret)
, который работает отлично, поэтому он должен быть IL, который я написал здесь.
Я пропустил что-то очевидное здесь? Ясное объяснение было бы полезно, поскольку я только начинаю с Emit.
Дополнительная информация от комментариев:
"Оригинальный" IL взят из IL-поколения в LINQ-панели.
@ Selman22 Я считаю, что это именно то, что он сделал, это похоже на то, когда скомпилировано IL. – flindeberg
Некоторые советы: 1) такой инструмент, как [Sigil] (https://www.nuget.org/packages/Sigil/), будет намного сложнее ошибиться; 2) если вы не уверены, скомпилируйте то, что вы ** хотите делать как обычный C# -код, затем перепрограммируйте IL в ILDASM или отражателе или аналогичном –
3) «nop» в IL - верный признак того, что вы на самом деле сделал # 2, но посмотрел на вывод отладочной сборки. Не делай этого; при выполнении # 2 всегда используйте сборку релизов. –