internal static CilMethodImport Create(MethodImport methodImport, ref CilReaders readers, MethodDefinition methodDef)
 {
     CilMethodImport import = new CilMethodImport();
     import._methodImport = methodImport;
     import._readers = readers;
     import._isModuleReferenceInitialized = false;
     import._isAttributesInitialized = false;
     import._methodDef = methodDef;
     return import;
 }
Exemple #2
0
        internal static CilMethodImport Create(MethodImport methodImport, ref CilReaders readers, MethodDefinition methodDef)
        {
            CilMethodImport import = new CilMethodImport();

            import._methodImport = methodImport;
            import._readers      = readers;
            import._isModuleReferenceInitialized = false;
            import._isAttributesInitialized      = false;
            import._methodDef = methodDef;
            return(import);
        }
Exemple #3
0
        public override PInvokeMetadata GetPInvokeMethodMetadata()
        {
            if (!IsPInvoke)
            {
                return(default(PInvokeMetadata));
            }

            MetadataReader metadataReader = MetadataReader;
            MethodImport   import         = metadataReader.GetMethodDefinition(_handle).GetImport();
            string         name           = metadataReader.GetString(import.Name);

            // Spot check the enums match
            Debug.Assert((int)MethodImportAttributes.CallingConventionStdCall == (int)PInvokeAttributes.CallingConventionStdCall);
            Debug.Assert((int)MethodImportAttributes.CharSetAuto == (int)PInvokeAttributes.CharSetAuto);
            Debug.Assert((int)MethodImportAttributes.CharSetUnicode == (int)PInvokeAttributes.CharSetUnicode);

            return(new PInvokeMetadata(name, (PInvokeAttributes)import.Attributes));
        }
Exemple #4
0
 public MethodImportRow(MethodImport import, MethodDefinitionHandle parent)
 {
     Import = import;
     Parent = parent;
 }
Exemple #5
0
 public MethodImportRow(MethodImport import, MethodDefinitionHandle parent)
 {
     Import = import;
     Parent = parent;
 }
Exemple #6
0
        public override PInvokeMetadata GetPInvokeMethodMetadata()
        {
            if (!IsPInvoke)
            {
                return(default(PInvokeMetadata));
            }

            MetadataReader   metadataReader = MetadataReader;
            MethodDefinition methodDef      = metadataReader.GetMethodDefinition(_handle);
            MethodImport     import         = methodDef.GetImport();
            string           name           = metadataReader.GetString(import.Name);

            ModuleReference moduleRef  = metadataReader.GetModuleReference(import.Module);
            string          moduleName = metadataReader.GetString(moduleRef.Name);

            MethodImportAttributes importAttributes = import.Attributes;

            // If either BestFitMapping or ThrowOnUnmappable wasn't set on the p/invoke,
            // look for the value in the owning type or assembly.
            if ((importAttributes & MethodImportAttributes.BestFitMappingMask) == 0 ||
                (importAttributes & MethodImportAttributes.ThrowOnUnmappableCharMask) == 0)
            {
                TypeDefinition declaringType = metadataReader.GetTypeDefinition(methodDef.GetDeclaringType());

                // Start with owning type
                MethodImportAttributes fromCA = GetImportAttributesFromBestFitMappingAttribute(declaringType.GetCustomAttributes());
                if ((importAttributes & MethodImportAttributes.BestFitMappingMask) == 0)
                {
                    importAttributes |= fromCA & MethodImportAttributes.BestFitMappingMask;
                }
                if ((importAttributes & MethodImportAttributes.ThrowOnUnmappableCharMask) == 0)
                {
                    importAttributes |= fromCA & MethodImportAttributes.ThrowOnUnmappableCharMask;
                }

                // If we still don't know, check the assembly
                if ((importAttributes & MethodImportAttributes.BestFitMappingMask) == 0 ||
                    (importAttributes & MethodImportAttributes.ThrowOnUnmappableCharMask) == 0)
                {
                    fromCA = GetImportAttributesFromBestFitMappingAttribute(metadataReader.GetAssemblyDefinition().GetCustomAttributes());
                    if ((importAttributes & MethodImportAttributes.BestFitMappingMask) == 0)
                    {
                        importAttributes |= fromCA & MethodImportAttributes.BestFitMappingMask;
                    }
                    if ((importAttributes & MethodImportAttributes.ThrowOnUnmappableCharMask) == 0)
                    {
                        importAttributes |= fromCA & MethodImportAttributes.ThrowOnUnmappableCharMask;
                    }
                }
            }

            // Spot check the enums match
            Debug.Assert((int)MethodImportAttributes.CallingConventionStdCall == (int)PInvokeAttributes.CallingConventionStdCall);
            Debug.Assert((int)MethodImportAttributes.CharSetAuto == (int)PInvokeAttributes.CharSetAuto);
            Debug.Assert((int)MethodImportAttributes.CharSetUnicode == (int)PInvokeAttributes.CharSetUnicode);
            Debug.Assert((int)MethodImportAttributes.SetLastError == (int)PInvokeAttributes.SetLastError);

            PInvokeAttributes attributes = (PInvokeAttributes)importAttributes;

            if ((ImplAttributes & MethodImplAttributes.PreserveSig) != 0)
            {
                attributes |= PInvokeAttributes.PreserveSig;
            }

            return(new PInvokeMetadata(moduleName, name, attributes));
        }