public void CreateMethodFromScratch()
{
IgnoreOnMono ();
var module = ModuleDefinition.CreateModule ("Pan", ModuleKind.Dll);
var type = new TypeDefinition ("Pin", "Pon", TypeAttributes.Public | TypeAttributes.Abstract | TypeAttributes.Sealed, module.ImportReference (typeof (object)));
module.Types.Add (type);
var method = new MethodDefinition ("Pang", MethodAttributes.Public | MethodAttributes.Static, module.ImportReference (typeof (string)));
type.Methods.Add (method);
var body = method.Body;
body.InitLocals = true;
var il = body.GetILProcessor ();
var temp = new VariableDefinition (module.ImportReference (typeof (string)));
body.Variables.Add (temp);
il.Emit (OpCodes.Nop);
il.Emit (OpCodes.Ldstr, "hello");
il.Emit (OpCodes.Stloc, temp);
il.Emit (OpCodes.Ldloc, temp);
il.Emit (OpCodes.Ret);
var sequence_point = new SequencePoint (body.Instructions [0], new Document (@"C:\test.cs")) {
StartLine = 0,
StartColumn = 0,
EndLine = 0,
EndColumn = 4,
};
method.DebugInformation.SequencePoints.Add (sequence_point);
method.DebugInformation.Scope = new ScopeDebugInformation (body.Instructions [0], null) {
Variables = { new VariableDebugInformation (temp, "temp") }
};
var file = Path.Combine (Path.GetTempPath (), "Pan.dll");
module.Write (file, new WriterParameters {
SymbolWriterProvider = new PdbWriterProvider (),
});
module = ModuleDefinition.ReadModule (file, new ReaderParameters {
SymbolReaderProvider = new PdbReaderProvider (),
});
method = module.GetType ("Pin.Pon").GetMethod ("Pang");
Assert.AreEqual ("temp", method.DebugInformation.Scope.Variables [0].Name);
}