예제 #1
0
 public DefinitionItem(AssemblyDefinition targetAssemblyDefinition, TypeDefinition targetTypeDefinition, MethodDefinition targetMethodDefinition, Type integrationType, NativeCallTargetDefinition definition)
 {
     TargetAssemblyDefinition = targetAssemblyDefinition;
     TargetTypeDefinition     = targetTypeDefinition;
     TargetMethodDefinition   = targetMethodDefinition;
     IntegrationType          = integrationType;
     Definition = definition;
 }
예제 #2
0
        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);
        }