public DefinitionItem(AssemblyDefinition targetAssemblyDefinition, TypeDefinition targetTypeDefinition, MethodDefinition targetMethodDefinition, Type integrationType, NativeCallTargetDefinition definition) { TargetAssemblyDefinition = targetAssemblyDefinition; TargetTypeDefinition = targetTypeDefinition; TargetMethodDefinition = targetMethodDefinition; IntegrationType = integrationType; Definition = definition; }
private static NativeCallTargetDefinition[] ReadIntegrations(string path) { var assembly = Assembly.LoadFrom(path); var instrumentationDefinitions = assembly.GetType("Datadog.Trace.ClrProfiler.InstrumentationDefinitions"); var method = instrumentationDefinitions.GetMethod("GetDefinitionsArray", BindingFlags.NonPublic | BindingFlags.Static); var array = (Array)method.Invoke(null, null); var elementType = array.GetType().GetElementType(); var disposeMethod = elementType.GetMethod("Dispose"); var definitionType = typeof(NativeCallTargetDefinition); var result = new NativeCallTargetDefinition[array.Length]; IntPtr signaturesPtr = default; for (int i = 0; i < array.Length; i++) { var boxedDefinition = (object)default(NativeCallTargetDefinition); var obj = array.GetValue(i); foreach (var field in elementType.GetFields()) { if (field.Name == "TargetSignatureTypes") { signaturesPtr = (IntPtr)field.GetValue(obj); continue; } definitionType.GetField(field.Name).SetValue(boxedDefinition, field.GetValue(obj)); } var length = ((NativeCallTargetDefinition)boxedDefinition).TargetSignatureTypesLength; var targetSignatureTypes = new string[length]; for (int j = 0; j < length; j++) { var ptr = Marshal.ReadIntPtr(signaturesPtr + Marshal.SizeOf <IntPtr>() * j); targetSignatureTypes[j] = Marshal.PtrToStringUni(ptr); } disposeMethod.Invoke(obj, null); result[i] = (NativeCallTargetDefinition)boxedDefinition; result[i].TargetSignatureTypes = targetSignatureTypes; } return(result); }