public void EditBodyWithScopesAndSymbolRoundtrip(RoundtripType roundtripType, bool forceUnresolved, bool reverseScopes) { var methodBody = CreateTestMethodWithLocalScopes(); methodBody = RoundtripMethodBody(methodBody, roundtripType, forceUnresolved, reverseScopes); var il = methodBody.GetILProcessor(); il.Replace(4, il.Create(OpCodes.Ldstr, "Test")); il.InsertAfter(5, il.Create(OpCodes.Ldloc_3)); var tempVar3 = new VariableDefinition(methodBody.Method.Module.ImportReference(typeof(string))); methodBody.Variables.Add(tempVar3); methodBody.Method.DebugInformation.Scope.Scopes [reverseScopes ? 0 : 1].Scopes.Insert(reverseScopes ? 0 : 1, new ScopeDebugInformation(methodBody.Instructions [5], methodBody.Instructions [6]) { Variables = { new VariableDebugInformation(tempVar3, "tempVar3") } }); methodBody = RoundtripMethodBody(methodBody, roundtripType, false, reverseScopes); var wholeBodyScope = VerifyWholeBodyScope(methodBody); AssertLocalScope(methodBody, wholeBodyScope.Scopes [0], 1, 2); AssertLocalScope(methodBody, wholeBodyScope.Scopes [1], 3, null); AssertLocalScope(methodBody, wholeBodyScope.Scopes [1].Scopes [0], 4, 5); AssertLocalScope(methodBody, wholeBodyScope.Scopes [1].Scopes [1], 5, 6); methodBody.Method.Module.Dispose(); }
static ModuleDefinition RoundtripModule(ModuleDefinition module, RoundtripType roundtripType) { if (roundtripType == RoundtripType.None) { return(module); } var file = Path.Combine(Path.GetTempPath(), "TestILProcessor.dll"); if (File.Exists(file)) { File.Delete(file); } ISymbolWriterProvider symbolWriterProvider; switch (roundtripType) { case RoundtripType.Pdb when Platform.HasNativePdbSupport: symbolWriterProvider = new PdbWriterProvider(); break; case RoundtripType.PortablePdb: default: symbolWriterProvider = new PortablePdbWriterProvider(); break; } module.Write(file, new WriterParameters { SymbolWriterProvider = symbolWriterProvider, }); module.Dispose(); ISymbolReaderProvider symbolReaderProvider; switch (roundtripType) { case RoundtripType.Pdb when Platform.HasNativePdbSupport: symbolReaderProvider = new PdbReaderProvider(); break; case RoundtripType.PortablePdb: default: symbolReaderProvider = new PortablePdbReaderProvider(); break; } return(ModuleDefinition.ReadModule(file, new ReaderParameters { SymbolReaderProvider = symbolReaderProvider, InMemory = true })); }
static MethodBody RoundtripMethodBody(MethodBody methodBody, RoundtripType roundtripType, bool forceUnresolvedScopes = false, bool reverseScopeOrder = false) { var newModule = RoundtripModule(methodBody.Method.Module, roundtripType); var newMethodBody = newModule.GetType("NS.TestType").GetMethod("function").Body; if (forceUnresolvedScopes) { UnresolveScopes(newMethodBody.Method.DebugInformation.Scope); } if (reverseScopeOrder) { ReverseScopeOrder(newMethodBody.Method.DebugInformation.Scope); } return(newMethodBody); }
public void ReplaceWithSymbolRoundtrip(RoundtripType roundtripType, bool forceUnresolved, bool reverseScopes) { var methodBody = CreateTestMethodWithLocalScopes(); methodBody = RoundtripMethodBody(methodBody, roundtripType, forceUnresolved, reverseScopes); var il = methodBody.GetILProcessor(); il.Replace(1, il.Create(OpCodes.Ldstr, "Test")); methodBody = RoundtripMethodBody(methodBody, roundtripType, false, reverseScopes); var wholeBodyScope = VerifyWholeBodyScope(methodBody); AssertLocalScope(methodBody, wholeBodyScope.Scopes [0], 1, 2); AssertLocalScope(methodBody, wholeBodyScope.Scopes [1], 3, null); AssertLocalScope(methodBody, wholeBodyScope.Scopes [1].Scopes [0], 4, 5); methodBody.Method.Module.Dispose(); }
public void RemoveWithSymbolRoundtrip(RoundtripType roundtripType, bool forceUnresolved, bool reverseScopes) { var methodBody = CreateTestMethodWithLocalScopes(); methodBody = RoundtripMethodBody(methodBody, roundtripType, forceUnresolved, reverseScopes); var il = methodBody.GetILProcessor(); il.RemoveAt(1); methodBody = RoundtripMethodBody(methodBody, roundtripType, false, reverseScopes); var wholeBodyScope = VerifyWholeBodyScope(methodBody); AssertLocalScope(methodBody, wholeBodyScope.Scopes [0], 1, 1); AssertLocalScope(methodBody, wholeBodyScope.Scopes [1], 2, null); AssertLocalScope(methodBody, wholeBodyScope.Scopes [1].Scopes [0], 3, 4); methodBody.Method.Module.Dispose(); }