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; }
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); }
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)); }
public MethodImportRow(MethodImport import, MethodDefinitionHandle parent) { Import = import; Parent = parent; }
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)); }