public bool CompareMethodSignatures(RuntimeMethodSignature signature1, RuntimeMethodSignature signature2) { IntPtr nativeLayoutSignature1 = signature1.NativeLayoutSignature; IntPtr nativeLayoutSignature2 = signature2.NativeLayoutSignature; if ((nativeLayoutSignature1 != IntPtr.Zero) && (nativeLayoutSignature2 != IntPtr.Zero)) { if (nativeLayoutSignature1 == nativeLayoutSignature2) { return(true); } NativeReader reader1 = GetNativeLayoutInfoReader(RuntimeAugments.GetModuleFromPointer(nativeLayoutSignature1)); NativeParser parser1 = new NativeParser(reader1, reader1.AddressToOffset(nativeLayoutSignature1)); NativeReader reader2 = GetNativeLayoutInfoReader(RuntimeAugments.GetModuleFromPointer(nativeLayoutSignature2)); NativeParser parser2 = new NativeParser(reader2, reader2.AddressToOffset(nativeLayoutSignature2)); return(CompareMethodSigs(parser1, parser2)); } else if (nativeLayoutSignature1 != IntPtr.Zero) { int token = signature2.Token; MetadataReader metadataReader = ModuleList.Instance.GetMetadataReaderForModule(signature2.ModuleHandle); MethodSignatureComparer comparer = new MethodSignatureComparer(metadataReader, token.AsHandle().ToMethodHandle(metadataReader)); return(comparer.IsMatchingNativeLayoutMethodSignature(nativeLayoutSignature1)); } else if (nativeLayoutSignature2 != IntPtr.Zero) { int token = signature1.Token; MetadataReader metadataReader = ModuleList.Instance.GetMetadataReaderForModule(signature1.ModuleHandle); MethodSignatureComparer comparer = new MethodSignatureComparer(metadataReader, token.AsHandle().ToMethodHandle(metadataReader)); return(comparer.IsMatchingNativeLayoutMethodSignature(nativeLayoutSignature2)); } else { // For now, RuntimeMethodSignatures are only used to compare for method signature equality (along with their Name) // So we can implement this with the simple equals check if (signature1.Token != signature2.Token) { return(false); } if (signature1.ModuleHandle != signature2.ModuleHandle) { return(false); } return(true); } }
public bool CompareMethodSignatures(RuntimeSignature signature1, RuntimeSignature signature2) { if (signature1.IsNativeLayoutSignature && signature2.IsNativeLayoutSignature) { if (signature1.StructuralEquals(signature2)) { return(true); } NativeFormatModuleInfo module1 = ModuleList.GetModuleInfoByHandle(new TypeManagerHandle(signature1.ModuleHandle)); NativeReader reader1 = GetNativeLayoutInfoReader(signature1); NativeParser parser1 = new NativeParser(reader1, signature1.NativeLayoutOffset); NativeFormatModuleInfo module2 = ModuleList.GetModuleInfoByHandle(new TypeManagerHandle(signature2.ModuleHandle)); NativeReader reader2 = GetNativeLayoutInfoReader(signature2); NativeParser parser2 = new NativeParser(reader2, signature2.NativeLayoutOffset); return(CompareMethodSigs(parser1, module1, parser2, module2)); } else if (signature1.IsNativeLayoutSignature) { int token = signature2.Token; MetadataReader metadataReader = ModuleList.Instance.GetMetadataReaderForModule(new TypeManagerHandle(signature2.ModuleHandle)); MethodSignatureComparer comparer = new MethodSignatureComparer(metadataReader, token.AsHandle().ToMethodHandle(metadataReader)); return(comparer.IsMatchingNativeLayoutMethodSignature(signature1)); } else if (signature2.IsNativeLayoutSignature) { int token = signature1.Token; MetadataReader metadataReader = ModuleList.Instance.GetMetadataReaderForModule(new TypeManagerHandle(signature1.ModuleHandle)); MethodSignatureComparer comparer = new MethodSignatureComparer(metadataReader, token.AsHandle().ToMethodHandle(metadataReader)); return(comparer.IsMatchingNativeLayoutMethodSignature(signature2)); } else { // For now, RuntimeSignatures are only used to compare for method signature equality (along with their Name) // So we can implement this with the simple equals check if (signature1.Token != signature2.Token) { return(false); } if (signature1.ModuleHandle != signature2.ModuleHandle) { return(false); } return(true); } }
public bool CompareMethodSignatures(RuntimeMethodSignature signature1, RuntimeMethodSignature signature2) { IntPtr nativeLayoutSignature1 = signature1.NativeLayoutSignature; IntPtr nativeLayoutSignature2 = signature2.NativeLayoutSignature; if ((nativeLayoutSignature1 != IntPtr.Zero) && (nativeLayoutSignature2 != IntPtr.Zero)) { if (nativeLayoutSignature1 == nativeLayoutSignature2) return true; NativeReader reader1 = GetNativeLayoutInfoReader(RuntimeAugments.GetModuleFromPointer(nativeLayoutSignature1)); NativeParser parser1 = new NativeParser(reader1, reader1.AddressToOffset(nativeLayoutSignature1)); NativeReader reader2 = GetNativeLayoutInfoReader(RuntimeAugments.GetModuleFromPointer(nativeLayoutSignature2)); NativeParser parser2 = new NativeParser(reader2, reader2.AddressToOffset(nativeLayoutSignature2)); return CompareMethodSigs(parser1, parser2); } else if (nativeLayoutSignature1 != IntPtr.Zero) { int token = signature2.Token; MetadataReader metadataReader = ModuleList.Instance.GetMetadataReaderForModule(signature2.ModuleHandle); MethodSignatureComparer comparer = new MethodSignatureComparer(metadataReader, token.AsHandle().ToMethodHandle(metadataReader)); return comparer.IsMatchingNativeLayoutMethodSignature(nativeLayoutSignature1); } else if (nativeLayoutSignature2 != IntPtr.Zero) { int token = signature1.Token; MetadataReader metadataReader = ModuleList.Instance.GetMetadataReaderForModule(signature1.ModuleHandle); MethodSignatureComparer comparer = new MethodSignatureComparer(metadataReader, token.AsHandle().ToMethodHandle(metadataReader)); return comparer.IsMatchingNativeLayoutMethodSignature(nativeLayoutSignature2); } else { // For now, RuntimeMethodSignatures are only used to compare for method signature equality (along with their Name) // So we can implement this with the simple equals check if (signature1.Token != signature2.Token) return false; if (signature1.ModuleHandle != signature2.ModuleHandle) return false; return true; } }