internal Address(Module module, int token, int version, int ilOffset) { Module = module; Token = token; Version = version; ILOffset = ilOffset; }
public void LanguageId() { var source = @"class C { static void F() { } }"; var bytes = CreateCompilationWithMscorlib(source).EmitToArray(); var resolver = Resolver.VisualBasicResolver; var csharpLanguageId = Guid.Parse("3f5162f8-07c6-11d3-9053-00c04fa302a1"); var vbLanguageId = Guid.Parse("3a12d0b8-c26c-11d0-b442-00a0244a1dd2"); var cppLanguageId = Guid.Parse("3a12d0b7-c26c-11d0-b442-00a0244a1dd2"); // Module loaded before requests. var module = new Module(bytes); using (var process = new Process(module)) { var requestDefaultId = new Request(null, MemberSignatureParser.Parse("F"), Guid.Empty); var requestMethodId = new Request(null, MemberSignatureParser.Parse("F"), DkmLanguageId.MethodId); var requestCSharp = new Request(null, MemberSignatureParser.Parse("F"), csharpLanguageId); var requestVB = new Request(null, MemberSignatureParser.Parse("F"), vbLanguageId); var requestCPP = new Request(null, MemberSignatureParser.Parse("F"), cppLanguageId); resolver.EnableResolution(process, requestDefaultId); VerifySignatures(requestDefaultId, "C.F()"); resolver.EnableResolution(process, requestMethodId); VerifySignatures(requestMethodId); resolver.EnableResolution(process, requestCSharp); VerifySignatures(requestCSharp); resolver.EnableResolution(process, requestVB); VerifySignatures(requestVB, "C.F()"); resolver.EnableResolution(process, requestCPP); VerifySignatures(requestCPP); } // Module loaded after requests. module = new Module(bytes); using (var process = new Process()) { var requestDefaultId = new Request(null, MemberSignatureParser.Parse("F"), Guid.Empty); var requestMethodId = new Request(null, MemberSignatureParser.Parse("F"), DkmLanguageId.MethodId); var requestCSharp = new Request(null, MemberSignatureParser.Parse("F"), csharpLanguageId); var requestVB = new Request(null, MemberSignatureParser.Parse("F"), vbLanguageId); var requestCPP = new Request(null, MemberSignatureParser.Parse("F"), cppLanguageId); resolver.EnableResolution(process, requestCPP); resolver.EnableResolution(process, requestVB); resolver.EnableResolution(process, requestCSharp); resolver.EnableResolution(process, requestMethodId); resolver.EnableResolution(process, requestDefaultId); process.AddModule(module); resolver.OnModuleLoad(process, module); VerifySignatures(requestDefaultId, "C.F()"); VerifySignatures(requestMethodId); VerifySignatures(requestCSharp); VerifySignatures(requestVB, "C.F()"); VerifySignatures(requestCPP); } }
public void OnLoad() { var source = @"class C { static void F(object o) { } object F() => null; }"; var compilation = CreateCompilationWithMscorlib(source); var module = new Module(compilation.EmitToArray()); using (var process = new Process()) { var resolver = Resolver.CSharpResolver; var request = new Request(null, MemberSignatureParser.Parse("C.F")); resolver.EnableResolution(process, request); VerifySignatures(request); process.AddModule(module); resolver.OnModuleLoad(process, module); VerifySignatures(request, "C.F(System.Object)", "C.F()"); } }
internal void OnFunctionResolved(Module module, int token, int version, int ilOffset) { _resolvedAddresses.Add(new Address(module, token, version, ilOffset)); }
internal void AddModule(Module module) { _modules.Add(module); }
public void ShouldEnableFunctionResolver() { var sourceA = @"class A { static void F() { } static void G() { } }"; var sourceB = @"class B { static void F() { } static void G() { } }"; var bytesA = CreateCompilationWithMscorlib(sourceA).EmitToArray(); var bytesB = CreateCompilationWithMscorlib(sourceB).EmitToArray(); var resolver = Resolver.CSharpResolver; // Two modules loaded before two global requests, // ... resolver enabled. var moduleA = new Module(bytesA, name: "A.dll"); var moduleB = new Module(bytesB, name: "B.dll"); using (var process = new Process(shouldEnable: true, modules: new[] { moduleA, moduleB })) { var requestF = new Request(null, MemberSignatureParser.Parse("F")); var requestG = new Request(null, MemberSignatureParser.Parse("G")); Assert.Equal(0, process.ShouldEnableRequests); resolver.EnableResolution(process, requestF); Assert.Equal(1, process.ShouldEnableRequests); resolver.EnableResolution(process, requestG); Assert.Equal(2, process.ShouldEnableRequests); VerifySignatures(requestF, "A.F()", "B.F()"); VerifySignatures(requestG, "A.G()", "B.G()"); } // ... resolver disabled. moduleA = new Module(bytesA, name: "A.dll"); moduleB = new Module(bytesB, name: "B.dll"); using (var process = new Process(shouldEnable: false, modules: new[] { moduleA, moduleB })) { var requestF = new Request(null, MemberSignatureParser.Parse("F")); var requestG = new Request(null, MemberSignatureParser.Parse("G")); Assert.Equal(0, process.ShouldEnableRequests); resolver.EnableResolution(process, requestF); Assert.Equal(1, process.ShouldEnableRequests); resolver.EnableResolution(process, requestG); Assert.Equal(2, process.ShouldEnableRequests); VerifySignatures(requestF); VerifySignatures(requestG); } // Two modules loaded before two requests for same module, // ... resolver enabled. moduleA = new Module(bytesA, name: "A.dll"); moduleB = new Module(bytesB, name: "B.dll"); using (var process = new Process(shouldEnable: true, modules: new[] { moduleA, moduleB })) { var requestF = new Request("B.dll", MemberSignatureParser.Parse("F")); var requestG = new Request("B.dll", MemberSignatureParser.Parse("G")); Assert.Equal(0, process.ShouldEnableRequests); resolver.EnableResolution(process, requestF); Assert.Equal(1, process.ShouldEnableRequests); resolver.EnableResolution(process, requestG); Assert.Equal(2, process.ShouldEnableRequests); VerifySignatures(requestF, "B.F()"); VerifySignatures(requestG, "B.G()"); } // ... resolver disabled. moduleA = new Module(bytesA, name: "A.dll"); moduleB = new Module(bytesB, name: "B.dll"); using (var process = new Process(shouldEnable: false, modules: new[] { moduleA, moduleB })) { var requestF = new Request("B.dll", MemberSignatureParser.Parse("F")); var requestG = new Request("B.dll", MemberSignatureParser.Parse("G")); Assert.Equal(0, process.ShouldEnableRequests); resolver.EnableResolution(process, requestF); Assert.Equal(1, process.ShouldEnableRequests); resolver.EnableResolution(process, requestG); Assert.Equal(2, process.ShouldEnableRequests); VerifySignatures(requestF); VerifySignatures(requestG); } // Two modules loaded after two global requests, // ... resolver enabled. moduleA = new Module(bytesA, name: "A.dll"); moduleB = new Module(bytesB, name: "B.dll"); using (var process = new Process(shouldEnable: true)) { var requestF = new Request(null, MemberSignatureParser.Parse("F")); var requestG = new Request(null, MemberSignatureParser.Parse("G")); resolver.EnableResolution(process, requestF); resolver.EnableResolution(process, requestG); Assert.Equal(0, process.ShouldEnableRequests); process.AddModule(moduleA); resolver.OnModuleLoad(process, moduleA); Assert.Equal(1, process.ShouldEnableRequests); VerifySignatures(requestF, "A.F()"); VerifySignatures(requestG, "A.G()"); process.AddModule(moduleB); resolver.OnModuleLoad(process, moduleB); Assert.Equal(2, process.ShouldEnableRequests); VerifySignatures(requestF, "A.F()", "B.F()"); VerifySignatures(requestG, "A.G()", "B.G()"); } // ... resolver enabled. moduleA = new Module(bytesA, name: "A.dll"); moduleB = new Module(bytesB, name: "B.dll"); using (var process = new Process(shouldEnable: false)) { var requestF = new Request(null, MemberSignatureParser.Parse("F")); var requestG = new Request(null, MemberSignatureParser.Parse("G")); resolver.EnableResolution(process, requestF); resolver.EnableResolution(process, requestG); Assert.Equal(0, process.ShouldEnableRequests); process.AddModule(moduleA); resolver.OnModuleLoad(process, moduleA); Assert.Equal(1, process.ShouldEnableRequests); VerifySignatures(requestF); VerifySignatures(requestG); process.AddModule(moduleB); resolver.OnModuleLoad(process, moduleB); Assert.Equal(2, process.ShouldEnableRequests); VerifySignatures(requestF); VerifySignatures(requestG); } // Two modules after two requests for same module, // ... resolver enabled. moduleA = new Module(bytesA, name: "A.dll"); moduleB = new Module(bytesB, name: "B.dll"); using (var process = new Process(shouldEnable: true)) { var requestF = new Request("A.dll", MemberSignatureParser.Parse("F")); var requestG = new Request("A.dll", MemberSignatureParser.Parse("G")); resolver.EnableResolution(process, requestF); resolver.EnableResolution(process, requestG); Assert.Equal(0, process.ShouldEnableRequests); process.AddModule(moduleA); resolver.OnModuleLoad(process, moduleA); Assert.Equal(1, process.ShouldEnableRequests); VerifySignatures(requestF, "A.F()"); VerifySignatures(requestG, "A.G()"); process.AddModule(moduleB); resolver.OnModuleLoad(process, moduleB); Assert.Equal(2, process.ShouldEnableRequests); VerifySignatures(requestF, "A.F()"); VerifySignatures(requestG, "A.G()"); } // ... resolver enabled. moduleA = new Module(bytesA, name: "A.dll"); moduleB = new Module(bytesB, name: "B.dll"); using (var process = new Process(shouldEnable: false)) { var requestF = new Request("A.dll", MemberSignatureParser.Parse("F")); var requestG = new Request("A.dll", MemberSignatureParser.Parse("G")); resolver.EnableResolution(process, requestF); resolver.EnableResolution(process, requestG); Assert.Equal(0, process.ShouldEnableRequests); process.AddModule(moduleA); resolver.OnModuleLoad(process, moduleA); Assert.Equal(1, process.ShouldEnableRequests); VerifySignatures(requestF); VerifySignatures(requestG); process.AddModule(moduleB); resolver.OnModuleLoad(process, moduleB); Assert.Equal(2, process.ShouldEnableRequests); VerifySignatures(requestF); VerifySignatures(requestG); } }
public void MissingMetadata() { var sourceA = @"class A { static void F1() { } static void F2() { } static void F3() { } static void F4() { } }"; var sourceC = @"class C { static void F1() { } static void F2() { } static void F3() { } static void F4() { } }"; var moduleA = new Module(CreateCompilationWithMscorlib(sourceA).EmitToArray(), name: "A.dll"); var moduleB = new Module(default(ImmutableArray<byte>), name: "B.dll"); var moduleC = new Module(CreateCompilationWithMscorlib(sourceC).EmitToArray(), name: "C.dll"); using (var process = new Process()) { var resolver = Resolver.CSharpResolver; var requestAll = new Request(null, MemberSignatureParser.Parse("F1")); var requestA = new Request("A.dll", MemberSignatureParser.Parse("F2")); var requestB = new Request("B.dll", MemberSignatureParser.Parse("F3")); var requestC = new Request("C.dll", MemberSignatureParser.Parse("F4")); // Request to all modules. resolver.EnableResolution(process, requestAll); Assert.Equal(0, moduleA.GetMetadataCount); Assert.Equal(0, moduleB.GetMetadataCount); Assert.Equal(0, moduleC.GetMetadataCount); // Load module A (available). process.AddModule(moduleA); resolver.OnModuleLoad(process, moduleA); Assert.Equal(1, moduleA.GetMetadataCount); Assert.Equal(0, moduleB.GetMetadataCount); Assert.Equal(0, moduleC.GetMetadataCount); VerifySignatures(requestAll, "A.F1()"); VerifySignatures(requestA); VerifySignatures(requestB); VerifySignatures(requestC); // Load module B (missing). process.AddModule(moduleB); resolver.OnModuleLoad(process, moduleB); Assert.Equal(1, moduleA.GetMetadataCount); Assert.Equal(1, moduleB.GetMetadataCount); Assert.Equal(0, moduleC.GetMetadataCount); VerifySignatures(requestAll, "A.F1()"); VerifySignatures(requestA); VerifySignatures(requestB); VerifySignatures(requestC); // Load module C (available). process.AddModule(moduleC); resolver.OnModuleLoad(process, moduleC); Assert.Equal(1, moduleA.GetMetadataCount); Assert.Equal(1, moduleB.GetMetadataCount); Assert.Equal(1, moduleC.GetMetadataCount); VerifySignatures(requestAll, "A.F1()", "C.F1()"); VerifySignatures(requestA); VerifySignatures(requestB); VerifySignatures(requestC); // Request to module A (available). resolver.EnableResolution(process, requestA); Assert.Equal(2, moduleA.GetMetadataCount); Assert.Equal(1, moduleB.GetMetadataCount); Assert.Equal(1, moduleC.GetMetadataCount); VerifySignatures(requestAll, "A.F1()", "C.F1()"); VerifySignatures(requestA, "A.F2()"); VerifySignatures(requestB); VerifySignatures(requestC); // Request to module B (missing). resolver.EnableResolution(process, requestB); Assert.Equal(2, moduleA.GetMetadataCount); Assert.Equal(2, moduleB.GetMetadataCount); Assert.Equal(1, moduleC.GetMetadataCount); VerifySignatures(requestAll, "A.F1()", "C.F1()"); VerifySignatures(requestA, "A.F2()"); VerifySignatures(requestB); VerifySignatures(requestC); // Request to module C (available). resolver.EnableResolution(process, requestC); Assert.Equal(2, moduleA.GetMetadataCount); Assert.Equal(2, moduleB.GetMetadataCount); Assert.Equal(2, moduleC.GetMetadataCount); VerifySignatures(requestAll, "A.F1()", "C.F1()"); VerifySignatures(requestA, "A.F2()"); VerifySignatures(requestB); VerifySignatures(requestC, "C.F4()"); } }
private static string GetMethodSignature(Module module, int token) { var reader = module.GetMetadataReader(); return(GetMethodSignature(reader, MetadataTokens.MethodDefinitionHandle(token))); }